如何将我的 2 向数据绑定从代码隐藏移动到 XAML

How to move my 2-way Data Binding from Code-Behind to XAML

WFP 和 C# 相对较新(长期 PHP 程序员)...

我成功地在文本框和对象的 属性 之间设置了 2-WAY 数据绑定。我能够在代码隐藏中建立绑定,但不是在 XAML 中建立绑定。

我想学习如何在 XAML 中进行绑定。也就是说,在下面的示例中,如何将行 myTestPanel.DataContext = CURRENT_NETWORK; 从代码隐藏移动到 XAML?

我查看了教程、示例等,但 none 有所帮助...他们似乎希望我将 TextBox(或父对象)绑定到 CLASS,而不是目的。一些示例建议使用合适的构造函数绑定到 class。但我不想那样做。我想绑定到一个可能已经存在一段时间的 EXISTING OBJECT。我可以在代码隐藏中做得很好......但是如何在 XAML 中做到这一点?

下面是我的代码:

namespace net
{
    public class network
    {
        public int ID { get; set; }   // Property bound to TextBox
    }

   public partial class MainWindow : Window
   {
        network CURRENT_NETWORK = new network();   // My OBJECT (which could have been around for a while)

        public MainWindow()
        {
            InitializeComponent();

            CURRENT_NETWORK.ID = 123;   // The object gets set up...

            // ** Below is the line I want to learn how to move to XAML **
            myTestPanel.DataContext = CURRENT_NETWORK;  // <- CRITICAL LINE
        }
    }
}

这是 XAML 的片段:

<Window x:Class="net.MainWindow"
    // some lines omitted
    xmlns:local="clr-namespace:net"
>

<DockPanel Name="myTestPanel" >
    <TextBox Text="{Binding Path=ID, Mode=TwoWay}"></TextBox>
</DockPanel>

2 向绑定就像一个梦:) 我可以在 TextBox 中看到对象 ID 属性 中的值,相反,如果我在 TextBox 中编辑数字,则对象被正确修改. (我发现有一个按钮会弹出一个消息框,但我的代码片段中没有显示。)

但是如何将 TextBox 和现有对象(即 myTestPanel.DataContext = CURRENT_NETWORK; 行)之间的关键绑定从代码隐藏移动到 XAML? 谢谢!


PS:为什么要在XAML中做绑定?部分 只是为了学习 ,部分是因为我认为它会更多 elegant/readable,因为 XAML 已经包含 属性 的名称。也就是说,我想在 XAML 中进行所有绑定,而不是在代码隐藏中进行一些绑定。

抱歉,我无法添加评论,所以将其作为答案发布。 我建议你只是有单独的 class 作为你的 ViewModel 例如NetWorkViewModel 并在您的 ViewModel 中创建一个现有对象类型的 属性 并更改 XAML 中的绑定。

public class NetworkViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private Network _model;
    public Network Model
    {
        get { return _model; }
        set
        {
            _model = value;
            OnPropertyChanged("Model");
        }
    }

    private void OnPropertyChanged(string propertyName) 
    {  }
}

public class Network : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private int _id;
    public int Id
    {
        get { return _id; }
        set
        {
            _id = value;
            OnPropertyChanged("Id");
        }
    }

    private void OnPropertyChanged(string propertyName)
    { }
}

在你的Xaml

xmlns:vm="clr-namespace:net"
...
<Window.DataContext>
  <vm:NetworkViewModel />
</Window.DataContext>
...
<DockPanel Name="myTestPanel" >
    <TextBox Text="{Binding Path=Model.Id, Mode=TwoWay}"></TextBox>
</DockPanel>

这是一种方法。阅读一些 MVVM 教程你会得到一些其他的想法。