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教程,你会得到一些其他的想法。