2013-06-11 102 views
1

我有一個WPF工具包DataGrid綁定到視圖模型中的可觀察對象集合。在這個DataGrid中,我爲該對象的某個字段定義了一個DataGridTemplateColumn。 (Car.Name)WPF DataGrid CurrentItem爲空

我正在嘗試檢測重複項,並在另一個(類似)對象列表中已經存在的單元格上設置了某種樣式。

當這個對話框被加載時,沒有選擇。視圖模型中的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 | ... < - Highlight

|汽車2 | ...

|汽車1 | ... < - 高亮

回答

1

你在想了錯誤的方式。這不應該是一種迭代方法。 IsDuplicate需要是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綁定語法,這只是從我的頭頂。但你明白了。

1

嘗試:

<toolkit:DataGrid ItemsSource="{Binding Cars}" 
        SelectedItem="{Binding CurrentCar}"> 
+0

當對話框加載時,沒有選擇。 – mastofact

+0

@mastofact然後以編程方式選擇一個項目。 'CurrentCar = Cars.FirstOrDefault()'。我不知道你的意思。 –

+1

@mastofact,我沒有試圖太過放肆,但我認爲你的問題實際上是錯誤的,這就是爲什麼@HighCore在這裏忽略了一點。我*想*你實際上並不想知道哪個項目是根據你陳述的目標選擇的:「我試圖檢測重複項,並在另一個(類似)對象列表中已經存在的單元格上設置了某種樣式。 「您所需要的只是「Car」的一個屬性,可以實現這一點;你不應該以任何特定順序遍歷每個項目。 WPF將爲您處理迭代。 – klugerama