2011-01-04 20 views
0

私は以下のクラスを持っている:mvvmパターンを使用してカスタムクラスのObservableCollectionのプロパティにTwoWayバインディングを作成する方法は?

public class UserGroup 
{ 
    public string GroupName { get; set; } 
    public bool IsIntheGroup{ get; set; } 
} 

私は、チェックボックスの各項目のコレクション内のチェックボックスは、のUserGroupのIsIntheGroupプロパティに基づいてchekedさを含むリストボックスにユーザーグループ項目ののObservableCollectionをバインドします。私のViewModelで私は、のUserGroupクラスののObservableCollection作っ:

public ObservableCollection<UserGroup> Groups { get; set; } 

を、私のデータベースモデル

からその内容(のUserGroupのインスタンス)をロードされた私は、私の見解では、次のコードを使用:

<ListBox ItemsSource="{Binding Groups, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <CheckBox IsChecked="{Binding IsIntheGroup, Mode=TwoWay}"/> 
      <TextBlock Text="{Binding GroupName}" /> 
     </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

ユーザーがリストのチェックボックスをオン/オフにすると通知されないため、双方向バインディングが失敗しました...

私は双方向バインドをどのようにしますかそのような場合には?

答えて

0

UserGroupクラスはINotifyPropertyChangedを実装する必要があり、そのクラスの各プロパティはそのセッターでPropertyChangedイベントを呼び出す必要があります。 ObservableCollectionは、コレクション内の各インスタンスのプロパティの変更ではなく、コレクションからの削除の追加をUIに通知します。

+0

ViewModelのコレクションにそれを反映させる方法はありますか?私はデータベースを更新するために使用できるようにObservableCollectionをmodificatinsでリフレッシュする方法を意味します。 – mill

+0

INPCを実装すると、両方の方法でバインディングが実行されます。つまり、コレクション内の項目のプログラム的変更がUI、およびユーザーによって呼び出されたUI変更は、コレクションインスタンスを更新します。変更を永続化するために、ビューモデルの任意の保存または適用動詞でObservableCollectionをトラバースすることができます。 – devdigital

関連する問題