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



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

我成功地在TextBox和对象的Property之间设置了双向数据绑定。我能够在代码隐藏中建立绑定,但不能在XAML中进行绑定。

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

我看了教程、例子等,但都无济于事。。。他们似乎希望我将TextBox(或父对象)绑定到CLASS,而不是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>

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

但是,我如何将TextBox和EXISTING OBJECT之间的关键绑定(即myTestPanel.DataContext = CURRENT_NETWORK;行)从Code Behind移动到XAML谢谢


PS:为什么要在XAML中进行绑定?部分只是为了学习,部分是因为我认为它会更优雅/可读,因为XAML已经包含属性的名称。也就是说,我想在XAML中进行所有绑定,而不是在那里和代码背后进行一些绑定。

很抱歉我无法添加评论,所以将其作为答案发布。我建议您将单独的类作为ViewModel,例如NetWorkViewModel,并在ViewModel中创建EXISTING OBJECT类型的属性,并更改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教程,你会得到一些其他的想法。

最新更新