如何根据使用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
您可以使用隐式样式和触发器:
<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>