0

私は、C# でのバインディングのアイデアに少し慣れていません。現在、作業中の MVVM を使用するアプリケーションがあります。たとえば、次のようなリストがあるとします。

List<string> Items = new List<string>()
{
    "Item1",
    "Item2",
    "Item3",
}

このリストには、次のような 3 つのテキスト ボックスがバインドされています。

XAML では:

<TextBox Name="TextBox1" text="{Binding TextSource1 Mode=TwoWay}">
<TextBox Name="TextBox2" text="{Binding TextSource2 Mode=TwoWay}">
<TextBox Name="TextBox3" text="{Binding TextSource3 Mpde=TwoWay}">

そしてコードで:

Public string TextSource1
{
    get { return Items[0]; }
    set { Items[0] = value; }
}
Public string TextSource2
{
    get { return Items[1]; }
    set { Items[1] = value; }
}
Public string TextSource3
{
    get { return Items[2]; }
    set { Items[2] = value; }
}

最初のテキストボックスに表示されている値が、リストにあるように現在「Item1」であるとします。ここから、ユーザーはそれを「Item4」に変更します。そこからリストを更新するにはどうすればよいですか?TwoWay に設定されている場合、自動的に更新されますか?

リストの値を変更する必要があるかどうかは、コードでわかっています。たとえば、次のように言います。

Items[2] = "Item4";

呼び出してテキストボックスを更新できます

RaisePropertyChanged("TextSource3");

しかし、それは現時点ではあまり役に立ちません。

4

3 に答える 3

1

アイテムの種類をに変更ObserableCollection<String>

テキストボックスのバインドを次のように変更します。

<TextBox Name="TextBox1" text="{Binding Items[0], Mode=TwoWay}">
<TextBox Name="TextBox2" text="{Binding Items[1], Mode=TwoWay}">
<TextBox Name="TextBox3" text="{Binding Items[2], Mpde=TwoWay}">

ObservableCollection の内部通知メカニズムにより、要素の 1 つを変更すると、UI に通知されます。

于 2013-07-02T13:46:38.403 に答える
1

注意すべき点がいくつかあります。まず、デフォルトでは、TextBoxフォーカスを失うまでテキストの変更を反映しません。これは、タブでコントロールの外に出るか、フォーカスを受け取ることができる別のコントロール (他の などTextBoxes) をクリックした場合に発生する可能性があります。

UpdateSourceTriggerを on に設定することで、この動作を変更できます(デフォルト モードであるため、onも必要ありBindingません)。 Mode=TwoWayTextBox

<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" />

2 つ目は、プロパティがPropertyChangedセッターでイベントを発生させる必要があることです。これは、単一のコントロールが機能するために厳密に必要というわけではありませんBindingが、他のコントロールを同じプロパティにバインドする場合に備えて実行する必要があります。

于 2013-07-02T13:47:24.557 に答える
0

最初のテキストボックスに表示されている値が、リストにあるように現在「Item1」であるとします。ここから、ユーザーはそれを「Item4」に変更します。そこからリストを更新するにはどうすればよいですか?TwoWay に設定されている場合、自動的に更新されますか?

はい、フォーカスを失うと自動的に更新されます。

于 2013-07-02T13:47:30.903 に答える