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