2016-08-27 27 views
0

DataGridにいくつかのデータを表示し、CollectionViewにバインドします。バインディングは正常に動作しますが、読み取り専用のようです:グリッド内のチェックボックスをオンにしてもモデルは更新されません。WPF ICollectionView双方向バインディング?

削減広告absurdum:背後

public class Item 
{ 
    public bool IsChecked 
    { 
     get 
     { 
      return _isChecked; 
     } 
     set 
     { 
      // Not hit when clicking on checkbox 
      _isChecked = value; 
     } 
    } 
    private bool _isChecked; 
} 

コード、私のコレクションビューは、依存関係プロパティです:

 private static DependencyProperty __CollectionViewProperty = DependencyProperty.Register 
     (
      "_CollectionView", 
      typeof(ICollectionView), 
      typeof(MyClass), 
      new PropertyMetadata(null) 
     ); 

     private ICollectionView _CollectionView 
     { 
      get { return (ICollectionView)GetValue(__CollectionViewProperty); } 
      set { SetValue(__CollectionViewProperty, value); } 
     } 

そして、このようにインスタンス化される:XAMLで

List<Item> items = new List<Item>(); 
items.Add(new Item()); 
this._CollectionView = CollectionViewSource.GetDefaultView(items); 

、私は単にDataGridを_CollectionViewにバインドし、チェックボックスをIsCheckedにバインドします。例外はなく、IsCheckedの状態はUIに正しく反映されています。

ただし、チェックボックスをクリックすると、モデルではなくUIが更新されます。私はWPFを初めて使っています.Cocoaから来ています.CocoaはNSArrayControllerであり、バインディングはそのままの状態で双方向で動作します。私は何が欠けていますか?

編集:XMLコード:

<DataGrid Grid.Row="1" ItemsSource="{ Binding _CollectionView}" AutoGenerateColumns="False" GridLinesVisibility="None" 
        RowHeight="60" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
        CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True" IsSynchronizedWithCurrentItem="True" 
        x:Name="_DataGrid"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="" Width="90" CanUserSort="False"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding IsChecked}" Click="CheckBox_Click" HorizontalAlignment="Left"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      <DataGrid.Columns> 
</DataGrid> 

答えて

0

OKには、それを得ました。

偶然の理由から、コレクションにバインドするときのデフォルトバインディングモードはOneWayであり、UpdateSourceTriggerはPropertyChangedではありません。だから... ...

docsが結合されて一つの方法に言及したが、更新トリガーがあまりにも異なっていない、結合XAMLは次のようになります。

<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

も正しくターゲットUIに伝播ソースへの変更を持っているためにたDependencyPropertyもthe most efficientで使用し、ドキュメントによれば

public class Item : DependencyObject 
{ 
     private static DependencyProperty __IsCheckedProperty = DependencyProperty.Register 
     (
      "IsChecked", 
      typeof(bool), 
      typeof(iOSAppItem), 
      new PropertyMetadata(true) 
     ); 

     public bool IsChecked 
     { 
      get { return (bool)GetValue(__IsCheckedProperty); } 
      set { SetValue(__IsCheckedProperty, value); } 
     } 
} 

:コンポーネント、最も簡単な方法は、DependencyObjectから継承し、依存関係プロパティとして関連するプロパティを宣言することです。

最後に、リストの上にObservableCollectionを選択することをお勧めします。アイテムの挿入/削除は無料で同期されます。

0

あなたのクラスにINotifyPropertyChangedのを実装し、このようなあなたにisCheckedプロパティを定義してみました:

public virtual bool IsChecked 
    { 
     get 
     { return _isChecked; } 
     set 
     { 
      if (_isChecked != value) 
      { 
       _isChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 
    } 
+0

はい、私はそれを試みましたが、チェックボックスをクリックするとセッターが呼び出されません... – Gregzo

+0

xamlをコピーできますか? – MohamedHamza

+0

が追加されました。クリックイベントも監視されていて、うまくいきました。 – Gregzo

関連する問題