datagrid列中的条件绑定

时间:2018-07-03 09:24:36

标签: wpf xaml datagrid wpfdatagrid

我有一个DataGrid,它的itemsSource是一个ObservableCollection<MyType>。此类型具有以下属性:

long ID;
long IDCategory;
long? IDState01;
long? IDEstate02;
long? IDEste03;

我有3个类别,如果是类别1,则IDState01不为null,其他状态为null。如果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中做到这一点,而不是使用转换器。

3 个答案:

答案 0 :(得分:1)

  

如果可能的话,我想在XAML中这样做...

您可以使用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>

答案 1 :(得分:0)

引入一个属性,该属性将根据类别获得/设置正确的状态:

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}"/>

答案 2 :(得分:-1)

我认为每个类别都需要自己的DataTemplate,并且需要DataTemplateSelector来根据类别类型分配DataTemplate。