使用可观察集合 wpf 绑定数据网格

本文关键字:绑定 数据 数据网 网格 wpf 集合 观察 | 更新日期: 2023-09-27 18:37:05

我有一个具有多列的数据网格,它具有itemsource={Binding},并且在代码隐藏中,我将DataContext设置为可观察集合

我的自定义类具有标题,类型,

语言,类型1(自定义类),类型2(自定义类)等属性

现在我的问题是,在一列类型中,我有文本值说"A"或"B",现在如果值为 A,那么我的 customClass 的对象将具有 type1 的对象,并且 type2 设置为 null,如果类型具有值"B",则类型1设置为空,类型2 具有值。

现在在语言中,我想以这样的方式绑定,如果类型有 A,则取 type1.someProperty 的值,如果它有 B,则取 type2.someProperty 的值。

这是我的 XAML 中的内容

<DataGrid x:Name="dg_Content" Margin="0,60,-0.4,0" VerticalAlignment="Top" Height="505" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding}" AutoGenerateColumns="False" ColumnWidth="*">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Title" Binding="{Binding _title}"/>
        <DataGridTextColumn x:Name="dgType" Header="Content Type" Binding="{Binding  _type}"/>
        <DataGridTextColumn Header="Language">
            <DataGridTextColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Style.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Binding="{Binding ElementName=dgType, Path=Content}" Value="A" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Content" Value="{Binding type1.someProperty}" />
                        </MultiTrigger>
                    </Style.Triggers>
                </Style></DataGridTextColumn.CellStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Created At" Binding="{Binding _createdAt}"/>
        <DataGridTemplateColumn Header="Edit/View">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Edit/View" Click="View_Click"></Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid> 

有人可以帮助我吗?

使用可观察集合 wpf 绑定数据网格

如果有人需要,这是我的做法。

Xaml 代码:

<DataGrid x:Name="DgContent" Margin="0,60,-0.4,0" VerticalAlignment="Top" Height="505" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto" CanUserAddRows="False" ItemsSource="{Binding}" AutoGenerateColumns="False" ColumnWidth="*">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Title" Binding="{Binding Title}"/>
        <DataGridTextColumn Header="Content Type" Binding="{Binding  Type}"/>
        <DataGridTextColumn Header="Language">
            <DataGridTextColumn.Binding>
                <MultiBinding Converter="{StaticResource ResourceKey=Content}">
                    <Binding Path="{x:Static local:MainWindow.cl}"></Binding>
                </MultiBinding>
            </DataGridTextColumn.Binding>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Created At" Binding="{Binding CreatedAt}"/>
        <DataGridTemplateColumn Header="Edit/View">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="Edit/View" Click="View_Click"></Button>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

代码隐藏:

public object Convert(object[] values, Type targetType,
           object parameter, System.Globalization.CultureInfo culture)
{
    try
    {
        if (((Content)values[0]).Type == "movie")
        {
            return ((Content)values[0]).Movie.Language;
        }
        else
            return ((Content)values[0]).Video.Language;
    }
    catch (Exception e)
    { return "EXception"; }
}
public object[] ConvertBack(object value, Type[] targetTypes,
       object parameter, System.Globalization.CultureInfo culture)
{
    throw new NotSupportedException("Cannot convert back");
}