我对C#中绑定的想法有点新意。我目前有一个使用MVVM的应用程序,我正在努力。比方说,我有一个像这样的列表:
List<string> Items = new List<string>()
{
"Item1",
"Item2",
"Item3",
}
绑定到此列表是三个文本框,如下所示:
在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");
但这对我来说没什么帮助。
答案 0 :(得分: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的内部通知机制,当您修改其中一个元素时,它将通知UI。
答案 1 :(得分:1)
有几点需要注意。首先,默认情况下,TextBox
不会传播文本更改,直到失去焦点为止。如果您跳出控件,或者单击另一个可以获得焦点的控件(如另一个TextBoxes
),则会发生这种情况。
您可以在Binding
上设置Mode=TwoWay
上的UpdateSourceTrigger
(您也不需要 TextBox
作为<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" />
更改此行为这是默认模式):
PropertyChanged
第二个是你的属性需要在他们的setter中引发Binding
事件。虽然单个{{1}}工作并不是绝对必要的,但如果您决定将其他控件绑定到同一属性,则需要这样做。
答案 2 :(得分:0)
假设第一个文本框中显示的值当前是“Item1”,因为它在列表中。从这里,用户将其更改为“Item4”。我该如何更新列表呢?如果它设置为TwoWay,它会自动更新吗?
是的,它会在失去焦点时自动更新。