0

我对 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");

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

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 的内部通知机制,当你修改它的一个元素时,它会通知 UI。

于 2013-07-02T13:46:38.403 回答
1

有几点需要注意。首先,默认情况下, aTextBox在失去焦点之前不会传播文本更改。如果您退出控件,或者单击另一个可以接收焦点的控件(如 other TextBoxes),则可能会发生这种情况。

UpdateSourceTrigger您可以通过设置on来更改此行为Binding(您也不需要 Mode=TwoWayon a TextBox,因为它是默认模式):

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

第二个是您的属性需要PropertyChanged在其设置器中引发事件。虽然这对于单个Binding工作来说并不是绝对必要的,但如果您决定将其他控件绑定到同一属性,您将需要这样做。

于 2013-07-02T13:47:24.557 回答
0

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

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

于 2013-07-02T13:47:30.903 回答