从控件更新数据源

本文关键字:数据源 更新 控件 | 更新日期: 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"。我该如何更新该列表?如果设置为双向,它会自动更新吗?

是的,当它失去焦点时会自动更新。