2011-08-24 67 views
6

私は少しだけ心を尽くしてしまいました。配列内の要素へのWPFの更新バインディング

ので、同様に、私は、BitArrayおよび配列内の要素にバインドされているチェックボックスのシリーズを持っている:

<CheckBox IsChecked="{Binding Permissions[0]}" /> 
<CheckBox IsChecked="{Binding Permissions[1]}" /> 
... 
<CheckBox IsChecked="{Binding Permissions[5]}" /> 

は、彼らが正しく、そのプロパティから値を取得しますが、チェックボックスを変更するには思えませんそのプロパティの設定をトリガします。

文字列配列の要素にバインドされた単一のTextBoxを使用して、本当に簡単な例を試しました。

class TestArray 
{ 
    private string[] _nameArray = new string[3]; 

    public TestArray() 
    { 
     _nameArray[1] = "test name"; 
    } 

    public string[] NameArray 
    { 
     get { return _nameArray; } 
     set { _nameArray = value; } 
    } 
} 

ここでUI要素です:

再び
<TextBox Text="{Binding NameArray[1], UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 

は、このテキストボックスは、結合うまくから名前を取得しますが、私はそれを変更した場合セッターにヒットしません。

これは完全に骨頭の問題であり、深刻な理解の欠如から生じる可能性がありますので、ご理解ください。

答えて

0

欠落しているのは、値が変更されたという通知です。標準の.NETプロパティ(いわゆるCLRプロパティ)にバインドするときは、追加のイベントをトリガして、値の変更についてコントロールに通知する必要があります。このSO Questionをご覧ください。さらにMSDNが役に立つかもしれません。

最初にWPFの基本概念の一部を読むことをお勧めします。 WPF in Action (slightly outdated)WPF Unleashedなどの書籍は役に立ちます。

2

私はこのアプローチを試みたことはありませんが、これはうまくいくとは思えません。なぜなら、あなたがセッターの火を見るのを待っているプロパティは、バインドされたプロパティではないからです。 NameArrayはNameArray [i]と同じではありません。

ObservableCollectionとテンプレートを調べて、複数のチェックボックスを実現することをお勧めします。たとえば、ObservableCollectionにバインドするチェックボックスの水平リストボックスを作成できます。

2

また、このTextBoxはバインディングから名前を取得しますが、変更した場合はセッターには当てられません。

バインダーは配列を置き換えるものではなく、単に配列の要素を置き換えます。配列の値をチェックすると、変更が反映されます。

BitArrayでも問題なく動作します(配列とBitArrayの両方で試してみました)。

ただし、配列(およびBitArray)にはINotifyPropertyChangedまたはINotifyCollectionChangedが実装されていないため、配列内の値に他のバインディングがある場合、それらは自動的にリフレッシュされません。 NameArrayの値を変更しないでください。配列の特定のインデックスの値を変更するため、これらのインターフェイスを実装するラッパーが必要です(ObservableCollection<T>など)

2

値が変更されないため、例:NameArray [1]。バインディングは機能しますが、セッターで終わることはありません。

より良いアプローチはObservableCollectionを使用して、あなたが結合要素インデックスを使用して、個々の配列要素を設定することはできませんItemsControl

+1

を私はアクションの私の次のコースだと思う - かなり良く動作するはずです。ありがとう! – statikuz

1

にバインドすることです。あなたがhttp://msdn.microsoft.com/en-us/library/ms743695.aspx(MSDNごとにINotifyPropertyChangedのを使用する必要があります

class TestArray : INotifyPropertyChanged 
{ 
    private string[] _nameArray = new string[3]; 

    public TestArray() 
    { 
     _nameArray[1] = "test name"; 
    } 

    public string Name 
    { 
     get { return _nameArray[0]; } 
     set { 
       _nameArray[0] = value; 
       NotifyPropertyChanged("Name"); 
      } 
    } 
} 

:あなたは、個々のプロパティをアップコレクションを分割して設定する必要があります)。

+0

私はそれを考えましたが、配列のすべての要素に対してプロパティを必要としません。それはそれを行う悪い方法のように思える。 – statikuz

0

これが私の仕事:

NotifyPropertyChanged("") 
関連する問題