数据网格列中的条件绑定
Conditional binding in column of datagrid
我有一个 DataGrid
,其中 itemsSource 是一个 ObservableCollection<MyType>
。此类型具有以下属性:
long ID;
long IDCategory;
long? IDState01;
long? IDEstate02;
long? IDEste03;
我有3个类别,如果是类别1,IDState01不为空,其他状态为空。如果category为2,则IDState02不为null,其他为null,等等。
我的 DataGrid
中有一个状态列,其值取决于类别。所以我想根据类别绑定到正确的 属性,所以如果类别为 1,它将绑定 属性 state01,如果类别为 3,它将绑定 属性 state02等等。
我认为我的 DataGrid
应该是这样的:
<DataGrid HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Header="State">
<!--Something here, perhaps a datatrigger.-->
</DateGridTextColumn>
</DataGrid.Columns>
</DataGrid>
谢谢。
编辑:如果可能的话,我想在 XAML 中完成,而不是使用转换器。
引入一个 属性,它将 get/set 基于类别的正确状态:
public long? State
{
get
{
if (IDCategory == 1) return IDState01;
if (IDCategory == 2) return IDState02;
return null;
}
set
{
if (IDCategory == 1) IDState01 = value;
else if (IDCategory == 2) IDState02 = value;
}
}
在 DataGird 中将列绑定到一个新的 属性:
<DataGridTextColumn Header="State" Binding="{Binding State}"/>
我认为您需要为每个类别拥有自己的 DataTemplate 和 DataTemplateSelector 以根据类别类型分配 DataTemplate。
I would like to do it in XAML if it is possible ...
您可以使用 DataGridTemplateColumn
:
<DataGridTemplateColumn Header="State">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IDCategory}" Value="1">
<Setter Property="Text" Value="{Binding IDState01}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="2">
<Setter Property="Text" Value="{Binding IDEstate02}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="3">
<Setter Property="Text" Value="{Binding IDEste03}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IDCategory}" Value="1">
<Setter Property="Text" Value="{Binding IDState01}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="2">
<Setter Property="Text" Value="{Binding IDEstate02}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="3">
<Setter Property="Text" Value="{Binding IDEste03}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
我有一个 DataGrid
,其中 itemsSource 是一个 ObservableCollection<MyType>
。此类型具有以下属性:
long ID;
long IDCategory;
long? IDState01;
long? IDEstate02;
long? IDEste03;
我有3个类别,如果是类别1,IDState01不为空,其他状态为空。如果category为2,则IDState02不为null,其他为null,等等。
我的 DataGrid
中有一个状态列,其值取决于类别。所以我想根据类别绑定到正确的 属性,所以如果类别为 1,它将绑定 属性 state01,如果类别为 3,它将绑定 属性 state02等等。
我认为我的 DataGrid
应该是这样的:
<DataGrid HorizontalAlignment="Stretch" Margin="5,5,5,5" VerticalAlignment="Stretch">
<DataGrid.Columns>
<DataGridTextColumn Header="State">
<!--Something here, perhaps a datatrigger.-->
</DateGridTextColumn>
</DataGrid.Columns>
</DataGrid>
谢谢。
编辑:如果可能的话,我想在 XAML 中完成,而不是使用转换器。
引入一个 属性,它将 get/set 基于类别的正确状态:
public long? State
{
get
{
if (IDCategory == 1) return IDState01;
if (IDCategory == 2) return IDState02;
return null;
}
set
{
if (IDCategory == 1) IDState01 = value;
else if (IDCategory == 2) IDState02 = value;
}
}
在 DataGird 中将列绑定到一个新的 属性:
<DataGridTextColumn Header="State" Binding="{Binding State}"/>
我认为您需要为每个类别拥有自己的 DataTemplate 和 DataTemplateSelector 以根据类别类型分配 DataTemplate。
I would like to do it in XAML if it is possible ...
您可以使用 DataGridTemplateColumn
:
<DataGridTemplateColumn Header="State">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding IDCategory}" Value="1">
<Setter Property="Text" Value="{Binding IDState01}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="2">
<Setter Property="Text" Value="{Binding IDEstate02}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="3">
<Setter Property="Text" Value="{Binding IDEste03}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IDCategory}" Value="1">
<Setter Property="Text" Value="{Binding IDState01}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="2">
<Setter Property="Text" Value="{Binding IDEstate02}" />
</DataTrigger>
<DataTrigger Binding="{Binding IDCategory}" Value="3">
<Setter Property="Text" Value="{Binding IDEste03}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>