3

ビュー モデル内のオブジェクトの監視可能なコレクションにバインドされている WPF ツールキット DataGrid があります。この DataGrid では、そのオブジェクトの特定のフィールドに対して DataGridTemplateColumn を定義しました。(車名)

重複を検出し、(類似の) オブジェクトの別のリストに既に存在するセルに特定のスタイルを設定しようとしています。

このダイアログが読み込まれると、選択はありません。ビュー モデルの IsDuplicate は、行の各アイテムに対して呼び出されますが、ビュー モデルで現在どのアイテムにあるのかわかりません。CurrentItem を使おうと思ったのですが、いつも null のようです。

質問: ビュー モデルで、現在どのアイテムが呼び出されているかを知るにはどうすればよいですか?

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含む のプロパティである必要があります。CarCar

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 に答える