我是C#和WPF的新手。我写了一个简单的程序。我有一个名为Counter
的类,它公开了一个从0开始的只读属性Count
,以及一个简单地将计数增加1的公共方法Increment
。 Counter
实施INotifyPropertyChanged
。
我有一个Window类(代码如下)。我将Counter
对象的实例传递给构造函数并执行绑定。窗口有一个按钮和一个标签。标签绑定到计数器的Count
属性,按钮调用Increment
。
这一切都有效。
然而,我在网络和MSDN上看到的大多数示例主要涉及在XAML中定义绑定。如何在此处修改我的示例以将绑定操作移出代码并进入标记? VS2010的“属性”窗口中的Binding属性似乎不知道如何做我想要的。也许这不可能?
另外一个问题:我不认为这个例子适合MVVM ......我的Counter类是独立的,除了通过它的属性之外,它不依赖于任何地方的视图。但是,CounterWindow类持有对它的引用。这是此参考的正确位置吗?我也想,也许我应该创建窗口,然后设置一个属性(例如CounterObject
),我将使用它而不是通过构造函数传递。
public partial class CounterWindow : Window {
Counter ctr;
public CounterWindow(Counter ctr) {
InitializeComponent();
this.ctr = ctr;
Binding b = new Binding("Count");
b.Source = ctr;
CounterLabel.SetBinding(Label.ContentProperty, b);
}
private void IncrementButton_Click(object sender, RoutedEventArgs e) {
ctr.Increment();
}
}
答案 0 :(得分:1)
这样的事情:
public CounterWindow(Counter ctr)
{
InitializeComponent();
DataContext = ctr;
}
标记:
<Label Content="{Binding Count}" />
<强> UPD 即可。 MVVM中有两种常见的方法:视图优先和模型优先 视图首先表示您最初创建视图,然后查看创建视图模型,它被绑定到 模型优先意味着首先创建视图模型,然后视图模型创建其视图并将其自身(通过构造函数或通过DataContext属性setter)传递为视图的数据上下文。
希望这会对你有所帮助。