突出显示DataGrid中的一个项目

时间:2015-09-02 11:54:12

标签: c# wpf datagrid

我在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>

如何使用此信息突出显示该行?

2 个答案:

答案 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);
      }
}