3

我有一个 WPF 工具包 DataGrid,它绑定到视图模型中可观察的对象集合。在这个 DataGrid 中,我为该对象的某个字段定义了一个 DataGridTemplateColumn。(车名)

我正在尝试检测重复项并在已存在于另一个(类似)对象列表中的单元格上设置某种样式。

加载此对话框时,没有选择。视图模型中的 IsDuplicate 确实会为该行的每个项目调用,但我无法判断它当前在视图模型中是哪个项目。我想过使用 CurrentItem,但它似乎总是为空。

问题:我如何在视图模型中知道当前正在调用哪个项目?

查看 XAML:

    <toolkit:DataGrid ItemsSource="{Binding Cars}"
                      CurrentItem="{Binding CurrentCar}">

     ...

     <toolkit:DataGridTemplateColumn.CellStyle>
       <Style TargetType="{x:Type toolkit:DataGridCell}">
         <Style.Triggers>
           <DataTrigger Binding="{Binding 
                        RelativeSource={RelativeSource FindAncestor, 
                        AncestorType=toolkit:DataGrid}, 
                        Path=DataContext.IsDuplicate}" Value="False">
             <Setter Property="BorderBrush" Value="Transparent" />
           </DataTrigger>
           <DataTrigger Binding="{Binding 
                        RelativeSource={RelativeSource FindAncestor, 
                        AncestorType=toolkit:DataGrid}, 
                        Path=DataContext.IsDuplicate}" Value="True">
             <Setter Property="BorderBrush" Value="Red" />
             <Setter Property="BorderThickness" Value="3" />
             <Setter Property="ToolTip" Value="Duplicate" />
           </DataTrigger>                   
         </Style.Triggers>
       </Style>
     </toolkit:DataGridTemplateColumn.CellStyle>

ViewModel.cs:

public Car CurrentCar { get; set; }

public bool IsDuplicate
{
  get
  {
    // Logic to check current car against a list of cars
    var x = CurrentCar; // null
   }
}

| 姓名 | ...

| 车1 | ... <-- 突出显示

| 车2 | ...

| 车1 | ... <-- 突出显示

4

2 回答 2

1

尝试:

<toolkit:DataGrid ItemsSource="{Binding Cars}"
                  SelectedItem="{Binding CurrentCar}">
于 2013-06-11T17:52:16.237 回答
1

你想错了。这不应该是一种迭代方法。IsDuplicate需要是 的属性Car,带有指向集合的链接,以便每个Car对象确定集合中是否有其他项目与其匹配。

public class Car
{
    public Guid Id { get; set; }
    public Collection<Car> Cars { get; set; }
    public bool IsDuplicate
    {
        get
        {
            // Logic to check current car against a list of cars
            return (Cars.Count(c => c.Id.Equals(this.Id))) > 1;
        }
    }    
}

然后在 XAML 中:

<toolkit:DataGridTemplateColumn.CellStyle>
   <Style TargetType="{x:Type toolkit:DataGridCell}">
     <Style.Triggers>
       <DataTrigger Binding="IsDuplicate" Value="False">
         <Setter Property="BorderBrush" Value="Transparent" />
       </DataTrigger>
       <DataTrigger Binding="IsDuplicate" Value="True">
         <Setter Property="BorderBrush" Value="Red" />
         <Setter Property="BorderThickness" Value="3" />
         <Setter Property="ToolTip" Value="Duplicate" />
       </DataTrigger>                   
     </Style.Triggers>
   </Style>
 </toolkit:DataGridTemplateColumn.CellStyle>

不太确定 XAML 绑定语法,这只是我的想法。但你明白了。

于 2013-06-11T17:53:01.707 回答