【问题标题】:WPF Data Binding object properties to text box by object name?WPF数据绑定对象属性到对象名称的文本框?
【发布时间】:2019-04-19 22:43:08
【问题描述】:

晚上好,

我有一个简单的问题:

我知道我可以像这样在数据上下文中绑定对象:

//Class CustomObject with a Property named "Property" with value "obj1"
CustomObject obj1 = new CustomObject("obj1");
DataContext = obj1;
<TextBox Text="{Binding Property}" 

这行得通。但是当我拥有一个以上的对象时会怎样? 班级。我尝试过这样的事情:

<TextBox Text="{Binding obj1.Property}" 

不幸的是,它不起作用。知道任何人我怎么能 按对象名称绑定?

谢谢。

编辑: 在 C# 中,它使用此代码:

CustomObject obj1 = new CustomObject("Test");
Binding myBinding = new Binding();
myBinding.Path = new PropertyPath("Property");
myBinding.Source = obj1;
textBox1.SetBinding(TextBox.TextProperty, myBinding);

所以我在 XAML 中尝试了同样的方法,不幸的是没有成功:

 <TextBox Text="{Binding Property, Source=Obj1}"/>

【问题讨论】:

    标签: c# wpf binding


    【解决方案1】:

    试试这个:

    <TextBox DataContext="{Binding Path=Obj1, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Text="{Binding Property}"/>
    

    在此示例中,Obj1 将是您正在编程的任何窗口的属性。 如果您打算将 Obj2 绑定到同一窗口中的另一个文本框等等,那么 Obj2 也将是一个属性...

    【讨论】:

      【解决方案2】:

      您将创建一个视图模型类,该类将 CustomObject 实例作为其属性之一。

      public class MyViewModel
      {
          public CustomObject Obj1 { get; set } 
          // declare other properties ...
      }
      

      然后将视图模型的实例分配给窗口的DataContext

      var obj1 = new CustomObject("obj1");
      var vm = new MyViewModel
      {
          Obj1 = obj1
          // assign other properties ...
      };
      DataContext = vm;
      

      现在像这样绑定它:

      <TextBox Text="{Binding Obj1.Property}" />
      

      【讨论】:

      • 我不想使用 mvvm 模式。我编辑了问题 - 也许你知道怎么做?谢谢
      • 由于 Window 的 DataContext 中只能有一个对象,因此您必须分配具有此类属性的类的实例。或者,您可以在后面的代码中将 CustomObject 分配给 TextBox 的 DataContext。