2016-09-21 24 views
1

私は、DataGridをINotifyPropertyChangedを実装するアイテムのObservableCollectionにバインドしています。 1つの列だけが編集可能です。別の列は、その列で編集された値に基づいて自動的に変更したいイメージです。それは動作しません。私はFODYを使用しています私のビューモデルWPF Datagridトリガーが機能しない

の部品を追加して、私の構造はかなり複雑である:それは右

<DataGrid ItemsSource="{Binding ItemRows,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" AutoGenerateColumns="False" 
        CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="false"> 

      <DataGrid.Columns> 
       <DataGridTextColumn Header="Editable" Binding="{Binding Editable, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Image x:Name="imgComplete" Width="20" Height="20"> 
           <Image.Style> 
            <Style TargetType="{x:Type Image}"> 
             <Setter Property="Source" Value="{StaticResource imgCheckmarkOrange}" /> 
             <Style.Triggers> 
              <DataTrigger Value="0" Binding="{Binding Editable,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
               <Setter Property="Source" Value="{StaticResource imgSadFace}"/> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </Image.Style> 
          </Image>                        
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate>       
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

を編集した後EDIT私は、例えば、行ヘッダーをクリックした場合(ソート)を更新するのではなく、ので、私はデータグリッドのソース

このコレクションは、別のプロパティ

クラスの変化にデータベースからデータがロードされ

[ImplementPropertyChanged] 
public class MyViewModel 
{ 

.... 
    public ObservableCollection<StockOrderRow> ItemRows { get; set; } = new ObservableCollection<StockOrderRow>(); 

..... 


} 

「StockOrに関連した唯一のものを掲載していますderRow」

public class StockOrderRow : BaseEntity 
    { 
    public string Field1{ get; set; } = ""; 
    ... 

    public int Editable { get; set; } = 0; 



    } 

とクラス "BaseEntity" 私はあなたの編集可能なプロパティのDataGridTemplateColumnを使用することをお勧めします

public class BaseEntity: INotifyPropertyChanged 
    { 
    public string Id { get; set; } 

    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 

     this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

} 
+0

あなたのviewmodel [s]コードを投稿してください。 – ASh

答えて

1

。これで、TextBoxのPropertyChangedを使ったバインドを直接処理できます。

 <DataGridTemplateColumn> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Editable}" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn.CellEditingTemplate> 
      <DataTemplate> 
       <TextBox Text="{Binding Editable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate> 
    </DataGridTemplateColumn> 

2つ目は、あなたのItemsClassesプロパティ編集可能にOnPropertyChangeを呼び出すためにならないことである

これは「doesnの場合はあなたのDataTriggerはモード双方向

<Style.Triggers> 
    <DataTrigger Value="0" Binding="{Binding Editable,UpdateSourceTrigger=PropertyChanged}"> 
     <Setter Property="Source" Value="{StaticResource imgSadFace}"/> 
    </DataTrigger> 
</Style.Triggers> 

にバインドする必要はありません

public class StockOrderRow:BaseEntity 
{ 
    public string Field1{ get; set; } = ""; 

    private int _editable = 0; 
    public int Editable { 
     get { return _editable; } 
     set { 
      if(value == _editable) return; 

      // Debug.WriteLine("Editable set. OldVal: " + _editable + "; NewVal:" + value); 
      _editable = value; 
      OnPropertyChanged(nameof(Editable)); 
     } 
    } 
} 

私はEditableのセッターでデバッグを開始します(TextBoxの入力中にプロパティが更新されているかどうかを確認してください...)。

+0

これは、ありがとう!今私は以前見たことのないものを見ています。私の行モデルクラスはINotifyPropertyChangedを実装していましたが、プロパティ変更イベントは発生しませんでした。このフィールドは単なる例であり、さらに多くのフィールドや他のクラスがあるので、私はFodyも追加します。View/ViewModelsとは別のプロジェクトで、フィールドだけでモデルを使用しています。別のインタフェースも同様です。両方のモデルとviewModelsでINotifyPropertyChangedを実装するのが一般的ですか? –

関連する問題