【问题标题】:How to move my 2-way Data Binding from Code-Behind to XAML如何将我的 2 向数据绑定从代码隐藏移动到 XAML
【发布时间】:2016-07-09 23:57:11
【问题描述】:

对 WFP 和 C#(长期 PHP 程序员)比较陌生...

我成功地在 TextBox 和 Object 的 Property 之间设置了 2-WAY 数据绑定。我能够在 Code-Behind 中建立绑定,但不能在 XAML 中进行。

我想学习如何在 XAML 中进行 BINDING。也就是说,在下面的示例中,如何将行 myTestPanel.DataContext = CURRENT_NETWORK; 从 Code-Behind 移动到 XAML?

我查看了教程、示例等,但没有任何帮助......他们似乎希望我将 TextBox(或父对象)绑定到 CLASS,而不是 OBJECT。一些示例建议使用合适的构造函数绑定到类。但我不想那样做。我想绑定到可能已经存在一段时间的 EXISTING OBJECT。我可以在 Code-Behind 中很好地做到这一点......但是如何在 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 的 sn-p:

<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-way 绑定就像做梦一样工作:) 我可以在 TextBox 中看到对象 ID 属性中的值,相反,如果我在 TextBox 中编辑数字,则对象被正确修改。 (我观察到一个按钮会弹出一个消息框,在我的代码 sn-p 中没有显示。)

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


PS:为什么要在 XAML 中进行绑定?部分只是为了学习,部分是因为我认为它会更优雅/可读,因为 XAML 已经包含属性的名称。即,我想在 XAML 中进行所有绑定,而不是在其中的一些和在 Code-Behind 中的一些。

【问题讨论】:

  • 你搜索过 MVVM 教程吗?
  • 您有不同的选择。其中之一是直接在窗口中设置 DataContext。类似于: 这样,Window 中的所有对象都将具有此 DataContext,直到设置另一个对象(例如:在列表中使用 ItemsSource 和 ItemTemplate 时)
  • 是的,我看了几个 MVVM 教程,谢谢。就直接在窗口中设置 DataContext 而言,我了解到“每当您在 XAML 中声明一个控件时,您就是在实例化一个类。”让我困惑的是:如何从代码隐藏中访问该实例化类?

标签: c# wpf xaml binding 2-way-object-databinding


【解决方案1】:

抱歉,我无法添加评论,因此将其发布为答案。 我建议你只是有一个单独的类作为你的 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 教程你会得到一些其他的想法。

【讨论】:

  • 感谢您的代码,谢谢!好吧,似乎我的带回家的教训(作为 WFP 的相对新手)是在代码隐藏(我的 1 LINE!)中进行绑定要容易得多。在 XAML 中执行此操作的复杂方式......再次感谢! :)
  • 有时一开始看起来很简单的东西在以后变得很难维护。不要依赖简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2015-03-25
  • 1970-01-01
  • 2019-07-06
  • 2015-12-30
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多