18

我想将网格中的一系列文本框绑定到对象的属性中,该对象本身就是我的 ViewModel(DataContext)中的另一个属性。

CurrentPersonNameAge属性组成

在 ViewModel 内部:

public Person CurrentPerson { get; set ... (with OnPropertyChanged)}

xml:

<TextBox Text="{Binding Name}" >
<TextBox Text="{Binding Age}" >

我不确定使用方法,我在网格范围内设置了另一个 DataContext,没有任何结果,还尝试再次设置源和路径,如 Source=CurrentPerson,Path=Age 没有任何结果,这些是试用版,看看是否会有任何变化。

我应该如何做到这一点?

4

2 回答 2

28

你们Person班的成员NameAge自己养INPC吗?

如果要更新其中一个Name或其中Age的值并将其反映在视图中,则需要它们在类中ViewModel单独更改属性。Person

绑定很好,但视图不会收到来自视图模型的更改通知。还请记住UpdateSourceTriggeraTextBox默认为LostFocus,因此将其设置为将在您键入PropertyChanged时更新您的字符串。ViewModel

简单的例子:

public class Person : INotifyPropertyChanged {
  private string _name;
  public string Name {
    get {
      return _name;
    }

    set {
      if (value == _name)
        return;

      _name = value;
      OnPropertyChanged(() => Name);
    }
  }

  // Similarly for Age ...
}

现在您的 xaml 将是:

<StackPanel DataContext="{Binding CurrentPerson}">
  <TextBox Text="{Binding Name}" />
  <TextBox Margin="15"
            Text="{Binding Age}" />
</StackPanel>

或者您也可以按照@Kshitij 的建议进行绑定:

<StackPanel>
  <TextBox Text="{Binding CurrentPerson.Name}" />
  <TextBox Margin="15"
            Text="{Binding CurrentPerson.Age}" />
</StackPanel>

并在您输入时更新视图模型:

<StackPanel DataContext="{Binding CurrentPerson}">
  <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
  <TextBox Margin="15"
            Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
于 2013-03-25T11:09:01.937 回答
20

尝试这个:

<TextBox Text="{Binding CurrentPerson.Name}" />
<TextBox Text="{Binding CurrentPerson.Age}" />

.本质上,您可以使用分隔符深入了解属性。

为了将来参考,如果您想深入了解集合,您可以MyCollection[x]像在代码中一样使用(其中 x 将替换为硬编码数字,而不是变量)。

于 2013-03-25T08:57:26.553 回答