在学习c#和wpf时,我正在努力掌握数据绑定。到目前为止不成功。我能在网上找到的所有帮助,即使被描述为“适合初学者”,对我来说也太复杂了。如果有人能够通过一个非常简单的例子提供绑定代码,我将不胜感激:
namespace BindingTest
{
class TestClass
{
public int testProperty;
public TestClass()
{
testProperty = 10;
}
}
}
namespace BindingTest
{
public partial class Window1 : Window
{
TestClass iTestClass = new TestClass();
public Window1()
{
InitializeComponent();
}
private void buttonAdd10_Click(object sender, RoutedEventArgs e)
{
iTestClass.testProperty += 10;
}
}
}
<Window x:Class="BindingTest1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox Height="25"
Margin="52,0,130,89"
Name="textBox1"
VerticalAlignment="Bottom"
/>
<Button Height="34"
HorizontalAlignment="Left"
Margin="38,40,0,0"
Name="buttonAdd10"
VerticalAlignment="Top"
Width="62"
Click="buttonAdd10_Click">
+10</Button>
</Grid>
</Window>
我想要做的就是将textBox1.Text绑定到iTestClass.testProperty,这样当我点击按钮时,我可以在文本框中看到它的值更改。为了实现这个目标,应该在这个简单例子的代码中做出哪些改变?
如果可以在没有INotifyPropertyChanged的情况下完成,那就是我想要的方式。 提前谢谢!
弗拉基米尔
答案 0 :(得分:3)
要绑定到WPF中的属性,您有两个选项。
a) INotifyPropertyChanged
b) DependencyProperty
由于您不想使用INotifyPropertyChanged
,因此您需要DependencyProperty
。
在MainWindow的代码隐藏中,在构造函数中添加以下行:
this.DataContext = iTestClass;
在MainWindow的XAML中,将此属性添加到TextBox:
Text="{Binding testProperty}"
按如下方式更改TestClass。
class TestClass : DependencyObject
{
public int testProperty
{
get { return (int)GetValue(TestPropertyProperty); }
set { SetValue(TestPropertyProperty, value); }
}
public static readonly DependencyProperty TestPropertyProperty =
DependencyProperty.Register("testProperty", typeof(int), typeof(TestClass));
public TestClass()
{
testProperty = 10;
}
}
如果您更喜欢INotifyPropertyChanged
版本,请将TestClass更改为此(其余部分相同):
class TestClass : INotifyPropertyChanged
{
private int _testProperty;
public int testProperty
{
get { return _testProperty; }
set
{
if (_testProperty == value)
return;
_testProperty = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("testProperty"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public TestClass()
{
testProperty = 10;
}
}
你为什么需要这个? WPF除非你以某种方式告诉它,否则无法判断该属性是否已更改。
WPF可以告诉它的两种方式是使用INotifyPropertyChanged
提供的事件,或者通过在WPF系统中注册属性,这是DependencyProperty
版本的工作方式。
如果你没有做其中一个,那么WPF将无法判断属性的值何时发生变化,因此绑定将不起作用。