我在DataGrid中显示Cars
,并希望突出显示一辆特殊的汽车,CurrentlySelectedCar
。
当用户双击汽车时,此车在我的MainViewModel中保存为CurrentlySelectedCar
。现在,每当用户回到DataGrid时,我想突出显示这个car = row,例如使用红色背景。
我已经找到了如何基于某些值突出显示DataGrid中的行,但在我的情况下,我所拥有的只是CurrentSelectedCar。
我的第一次尝试:
<Style TargetType="DataGridRow">
<Style.Triggers>
<!-- not working-->
<DataTrigger Binding="{Binding CurrentlySelectedCar}" >
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
我的第二次尝试:
<Style TargetType="DataGridRow">
<Style.Triggers>
<!-- not working either, "Binding can only be set on DependencyProperty of DependecyObject"-->
<DataTrigger Binding="{Binding Guid}" Value="{Binding CurrentlySelectedCar.Guid}" >
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
如何使用此信息突出显示该行?
答案 0 :(得分:1)
我认为你必须做这样的回答:Using bindings in DataTrigger condition
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource someMultiConverter}">
<Binding Path="Guid"></Binding>
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type Datagrid}}" Path="CurrentlySelectedCar.Guid"></Binding>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
如果两个Guid相等,你必须编写一个返回true的多转换器。
答案 1 :(得分:0)
请尝试以下方法,因为每个数据网格行都有一个IsSelected属性,您可以直接绑定它。
<DataGrid EnableRowVirtualization="False">
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" >
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
更新回复
现在的问题是你的DataContext是DataGridRow,它无法访问MainViewModel。您可以通过将DataGridRow传递给知道当前MainViewModel的转换器来解决此问题。但是,这是很多代码,几乎无法理解。
<Window>
<Window.Resources>
<local:IsCurrentlySelectedCarConverter x:Key="IsCurrentlySelectedCarConverter" />
</Window.Resources>
...
<DataTrigger Binding="{Binding
Path=DataContext,
Converter={StaticResource IsCurrentlySelectedCarConverter}}" >
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Window>
这里有相应的转换器
public class IsCurrentlySelectedConverter : IValueConverter
{
public MainViewModel MainViewModel { get; set;}
public object Convert(object value, ....)
{
return (value == MainViewModel.CurrentlySelectedCar);
}
}
并且您需要在视图中手动连接转换器的MainViewModel
this.Resources["IsCurrentlySelectedCarConverter"].MainViewModel = _mainViewModel;
此时您必须质疑已创建的怪物的可维护性。
最好用Car
替换每个CarViewModel
,以便它有一个名为IsSelected
的属性,您可以在代码中维护它。我认为以下内容更容易理解实际情况。
public class CarViewModel : INotifyPropertyChanged
{
public MainViewModel { get; set; }
public bool IsSelected { get { return this == MainViewModel.CurrentlySelectedCar; } }
// Call RaisePropertyChanged("IsSelected") whenever
// CurrentlySelectedCar is changed
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName);
}
}