从控件更新数据源
本文关键字:数据源 更新 控件 | 更新日期: 2023-09-27 18:20:52
我对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"。我该如何更新该列表?如果设置为双向,它会自动更新吗?
我在代码中知道如果我要更改列表中的值,比如:
Items[2] = "Item4";
我可以通过调用来更新文本框
RaisePropertyChanged("TextSource3");
但目前这对我没有多大帮助。
有几点需要注意。首先,默认情况下,TextBox
在失去焦点之前不会传播文本更改。如果您在控件外打标签,或者单击另一个可以接收焦点的控件(如其他TextBoxes
),则可能会发生这种情况。
您可以通过在Binding
上设置UpdateSourceTrigger
来更改此行为(您也不需要在TextBox
上设置Mode=TwoWay
,因为这是默认模式):
<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" />
第二种情况是,您的属性需要在其setter中引发PropertyChanged
事件。虽然这对于单个Binding
的工作来说并不是绝对必要的,但如果您决定将其他控件绑定到同一属性,则需要这样做。
将项目类型更改为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。
假设第一个文本框中显示的值当前为列表中的"Item1"。用户在此将其更改为"Item4"。我该如何更新该列表?如果设置为双向,它会自动更新吗?
是的,当它失去焦点时会自动更新。