UserControl和主窗口之间的绑定问题
本文关键字:绑定 问题 之间 窗口 UserControl | 更新日期: 2023-09-27 18:17:06
我在这个绑定中缺少一些东西,因为它不起作用。这是为了学习的目的,如果你看到如何可以改进,请告诉我。但除此之外,我也很想知道为什么这不起作用。
在我的MainWindow
中有一个CheckBox
,它绑定了一个命令:checkCommand
。
public Command checkCommand { get; set; }
public RootViewModel()
{
checkCommand = new Command(mark);
}
private void mark()
{
myThingsCollection[0].marked= true;
}
该命令工作正常,并且它还将marked
的状态更改为true
(我已经用MessageShowBox
进行了测试)。
我之前已经将UC添加到ObsevableCollection<UC>
(myThingsCollection
)并以这种方式在MainWindow.cs
ItemsControl
<ItemsControl ItemsSource="{Binding myThingsCollection}">
<DataTemplate> <!--I've ommited some parts here--!>
<local:UC/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
UC显示正常。
marked
是UCViewModel
的一个属性:
class UCViewModel
{
#region Implementation of INotifyPropertyChanged
private bool _marked;
public bool marked
{
get
{
return _marked;
}
set
{
_marked= value;
OnPropertyChanged("marked");
}
}
}
UserControl
(UC
)有一个CheckBox
,我这样绑定:
<CheckBox Content="Hello!" IsChecked="{Binding marked}"/>
并这样设置DataContext
(在UC.cs.xaml后面的代码中)
public UC()
{
UCViewModel context = new UCViewModel();
DataContext = context;
InitializeComponent();
}
但是它不起作用。我不知道它少了什么。顺便说一下,我很确定这不是解决这个问题的好方法,有更简单的方法吗?由于
下载链接:Here
^^ Link应该有一个项目,你所做的一切都很好。
如果你想从你的代码中寻找改进的建议,一些指针:
- 用特定的样式指南命名变量。属性以"Uppercase"开头。StyleCop可以帮助识别问题。是的,样式指南非常重要:)
- 与MVVM,你的
MyThingsCollection
不应该是UserControl
的集合,但他们应该是他们的VM的集合 不要在视图后面的代码中创建VM(除非你确定你在做什么)。这不仅会重置你的VM,而且还会经常创建视图,这可能不是理想的,特别是在MVVM中。 - 在使用MVVM时使用MVVM辅助库,即使你想自己做事情。学习系统,然后自己去做,而不是马上走漫长的道路。
- 不保持查看虚拟机中相关元素。这破坏了MVVM。千万别这么做。即使您认为没有其他选择,也有很多方法可以避免这样做。只需搜索em
如果你确定你的视图模型实现,那么试着改变你的绑定语法。
IsChecked="{Binding path=marked, Mode=TwoWay}"