如何根据使用MVVM绑定的数据更改DataGrid的单元格

本文关键字:数据 DataGrid 单元格 绑定 何根 MVVM | 更新日期: 2023-09-27 18:15:23

我正在使用MVVM Light Toolkit,并且我有一个绑定到ObservableCollection的DataGrid。只显示一个文本列。我希望单元格的文本为粗体或Normal,具体取决于显示对象内部的布尔值。我想我可以使用RelayCommands,但它们只需要1个参数,而且我至少需要2个参数才能获得CellContent(DataGridRowEventArgs和DataGrid本身(。我试图在"LoadingRow"事件上激发一个RelayCommandExecute委托,但只有一个参数我做不到。

以下是XAML中的DataGrid:

<DataGrid x:Name="dataGrid1" HorizontalAlignment="Left" Margin="112,34,0,8" Width="100" IsReadOnly="True" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" CanUserResizeRows="False" ItemsSource="{Binding CurrentNewsList}" AutoGenerateColumns="False" SelectedIndex="0">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Title}" MinWidth="92" Width="Auto" FontFamily="Segoe UI" Foreground="Black" FontWeight="{Binding CurrentNewsList[0].MyFont}"/>
        </DataGrid.Columns>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <Custom:EventToCommand Command="{Binding NewsSelectedCommand}" CommandParameter="{Binding SelectedIndex, ElementName=dataGrid1}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>

我在"混合"中设置了栅格。请注意,FontWeight的绑定方式类似于"{Binding CurrentNewsList[0].MyFont}"。对吗?我也尝试过"{Binding MyFont}",但都得到了相同的结果:No BOld:(

MyFont是在Object构造函数中用布尔值设置的:

MyFont = newIsRead ? FontWeights.Normal : FontWeights.Bold;

请帮忙。

Thx

如何根据使用MVVM绑定的数据更改DataGrid的单元格

您可以使用隐式样式和触发器:

<DataGrid.Resources>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <DataTrigger Binding="{Binding MyBoolean}" Value="True">
                <Setter Property="TextElement.FontWeight" Value="Bold" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

(如果您有更多的列,您可以使用列上的样式(ElementStyle&ElementEditingStyle(来限制效果(

在这种情况下,我通常会创建一个专门用于绑定的"模型对象"。因此,您没有绑定到"Customer"的可观察集合,而是绑定到"CustomerModel"的可观测集合,其中模型对象有一个"CustomerName"属性,然后是与所需字体相对应的其他属性(如果您不希望VM层了解视图问题,则可以是实际的font对象,也可以是通过值转换器解析的某种枚举(。这个模型对象可以根据您提到的布尔属性来确定哪些可用。

以下是我如何使用H.B解决方案:

            <DataGrid.Resources>
            <Style x:Key="Style1" TargetType="{x:Type TextBlock}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsRead}" Value="False">
                        <Setter Property="FontWeight" Value="Bold" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Title}" ElementStyle="{StaticResource ResourceKey=Style1}" />
        </DataGrid.Columns>