WPF DataGrid가 있는데 DataView의 데이터로 채 웁니다. 조건부로 Predicate
함수의 결과를 기반으로 DataGrid의 각 셀에 스타일을 적용하려고합니다.원본 개체의 Predicate 결과에 따라 스타일을 조건부로 바인딩 할 수 있습니까?
아직 WPF 데이터 바인딩을 얻지 못하므로 어떻게 시작해야하는지, 어디에서 시작해야하는지에 관해서는 분실했습니다. 누구든지 포인터 나 솔루션을 제공 할 수 있습니까?
WPF DataGrid가 있는데 DataView의 데이터로 채 웁니다. 조건부로 Predicate
함수의 결과를 기반으로 DataGrid의 각 셀에 스타일을 적용하려고합니다.원본 개체의 Predicate 결과에 따라 스타일을 조건부로 바인딩 할 수 있습니까?
아직 WPF 데이터 바인딩을 얻지 못하므로 어떻게 시작해야하는지, 어디에서 시작해야하는지에 관해서는 분실했습니다. 누구든지 포인터 나 솔루션을 제공 할 수 있습니까?
이러한 바인딩을 수행하는 표준 ("XAML 전용"과 같은) 방법은 없습니다. 바인딩 자체는 시각적 요소와 소스의 속성 값 (인스턴스 또는 정적) 간의 1 : 1 관계를 지정할 수있게합니다. 속성은 속성을 통해 자동으로 표현되지 않으므로 바인딩 할 수 없습니다.
그러나 원본을 가져 와서 특성의 존재 여부를 확인하고 관심있는 스타일 이름을 반환하는 사용자 지정 변환기를 작성할 수 있습니다. 이 속성을 멋지게 만들려면 속성에 실제 스타일 이름을 사용할 수 있습니다. 비즈니스 모델이 뷰 논리에 대한 특정 지식을 갖기 때문에 프레젠테이션에 준 강하게 묶여 있음을 의미합니다.
MSDN (http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion)의 데이터 바인딩 개요에서 사용자 지정 변환기의 예를 볼 수 있습니다. 특정 경우에는 Convert 메서드의 값으로 실제 인스턴스를 지정할 수 있도록 원본 개체 자체에 바인딩을 만들어야합니다 (Path를 지정하지 않음). 이렇게하면 Type을 가져 와서 속성을 확인한 다음 바인딩을 위해 반환 할 Style 객체를 만들 수 있습니다.
업데이트 : 특정 셀의 스타일을 지정하려면 AutoGenerateColumns를 해제하고 특정 셀에 대해 DataGridTempletaColumn을 지정해야합니다. 그런 다음 자신 만의 데이터 템플릿을 지정합니다.이 데이터 템플릿은 객체에 바인딩 된 데이터이며 스타일 선택기를 사용합니다.
CellTemplateSelector
이있는 DataGridTemplateColumn
을 사용하여 뷰 모델의 임의의 속성을 기반으로 셀의 데이터 템플릿을 선택할 수 있습니다. 자원의
:
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplateSelector>
<local:MyItemDataTemplateSelector TypeProperty="Type"
DefaultTemplate="{StaticResource SomeCellStyle}"
SomeTemplate="{StaticResource SomeCellStyle}"
OtherTemplate="{StaticResource OtherCellStyle}" />
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
코드 : 나는 StyleSelector``주변에 놀이를 했어
public class MyItemViewModel
{
public MyEnum Type { get; set; }
}
public class MyItemDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultTemplate { get; set; }
public DataTemplate SomeTemplate { get; set; }
public DataTemplate OtherTemplate { get; set; }
public string TypeProperty { get; set; }
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
if (item != null)
{
var type = item.GetType();
var property = type.GetProperty(TypeProperty);
if (property != null)
{
var value = property.GetValue(item, null);
if (value != null)
{
switch ((MyEnum) value)
{
case MyEnum.SomeValue: return SomeTemplate;
case MyEnum.OtherValue: return OtherTemplate;
}
}
}
}
return DefaultTemplate;
}
}
하지만 내가 할 수있는 '데이터 격자의
'DataGrid.ItemContainerStyleSelector'가 행이 아닌 개별 셀에 적용되도록하는 방법을 알아 냈습니다. – thecoop