Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从控件更新数据源_C#_Wpf_Mvvm_Binding - Fatal编程技术网

C# 从控件更新数据源

C# 从控件更新数据源,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我对C#中的绑定有点陌生。我目前正在开发一个使用MVVM的应用程序。例如,假设我有这样一个列表: List<string> Items = new List<string>() { "Item1", "Item2", "Item3", } 假设第一个文本框中显示的值当前为列表中的“Item1”。从这里,用户将其更改为“Item4”。我将如何从中更新列表?如果设置为双向,是否会自动更新 我知道在代码中,如果我要更改列表中的值,请说: Items[2

我对C#中的绑定有点陌生。我目前正在开发一个使用MVVM的应用程序。例如,假设我有这样一个列表:

List<string> Items = new List<string>()
{
    "Item1",
    "Item2",
    "Item3",
}
假设第一个文本框中显示的值当前为列表中的“Item1”。从这里,用户将其更改为“Item4”。我将如何从中更新列表?如果设置为双向,是否会自动更新

我知道在代码中,如果我要更改列表中的值,请说:

Items[2] = "Item4";
我可以通过调用更新文本框

RaisePropertyChanged("TextSource3");

但目前这对我没有多大帮助。

将项目类型更改为
ObserableCollection

将文本框的绑定更改为:

<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。

有几件事需要注意。首先,默认情况下,
文本框在失去焦点之前不会传播文本更改。如果选项卡脱离控件,或单击另一个可接收焦点的控件(如其他
文本框
),则可能发生这种情况

您可以通过在
绑定
上设置来更改此行为(您也不需要在
文本框
上设置
模式=双向
,因为它是默认模式):


第二,属性需要在其setter中引发
PropertyChanged
事件。虽然单个
绑定
严格来说并不需要这样做,但如果您决定将其他控件绑定到同一属性,则需要这样做

假设第一个文本框中显示的值当前为列表中的“Item1”。从这里,用户将其更改为“Item4”。我将如何从中更新列表?如果设置为双向,是否会自动更新


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

对不起,问题是什么?@Bolu你读了全部内容吗?我问:“假设第一个文本框中显示的值当前是列表中的“Item1”。用户从这里将其更改为“Item4”。我如何从中更新列表?如果设置为双向,它是否会自动更新?”您需要提高“RaisePropertyChanged”在您的财产中发生的事件set@Bolu我还没有机会尝试它,因为实际应用程序中的代码要大得多,而且我最初并没有这样实现它,所以我还没有办法知道。这就是我为什么要问的原因。@Shane.C这不会让文本框再次从列表中的值变成“Item1”吗?我想从文本框中更新列表。不是相反。我喜欢你的答案,但我正在寻找一种从UI更新元素的方法。不是从元素更新UI的方法。您完全可以从文本框更新ViewModel上的数据。问题是您是否希望在来自UI的通知中使用附加逻辑。使用单独的属性包装集合索引的好处是可以在setter中添加一些逻辑。如果绑定直接应用于集合,则必须添加事件侦听器。但是,我在您的代码中没有看到这种情况。
RaisePropertyChanged("TextSource3");
<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}">
<TextBox Name="TextBox1" text="{Binding TextSource1, UpdateSourceTrigger=PropertyChanged}" />