[英]Wpf Binding Confusion
我正在尝试学习MVVM。 我了解这个概念,但是我对绑定感到困惑。 我不确定在哪里绑定我的Fill属性。 请帮忙。 Tqvm高级。
视图-名称:MainScreen.xaml
<Path Fill="{Binding mainScreenClass, Converter={StaticResource colorConverter}}"/>
inCodeBehind
DataContext = new vmMainScreen();
ViewModel-名称:vmMainScreen
public ICommand cmdMouseEnterNav { get; private set; }
public mMainScreen mainScreenClass { get; set; }
public vmMainScreen()
{
mainScreenClass = new mMainScreen();
mainScreenClass.propNaviconFill = new SolidColorBrush(Colors.White);
naviconMouseEventChecker();
}
private void naviconMouseEventChecker()
{
cmdMouseEnterNav = new SimpleCommand
{
ExecuteDelegate = x => mainScreenClass.propNaviconFill = (SolidColorBrush)(new BrushConverter().ConvertFrom("#c5a02b"))
};
}
型号-名称:mMainScreen
public class mMainScreen : INotifyPropertyChanged
{
private Brush _NaviconFill = new SolidColorBrush(Colors.White);
public Brush propNaviconFill
{
get
{
return this._NaviconFill;
}
set
{
this._NaviconFill = value;
NotifyPropertyChanged("propNaviconFill");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
我了解到当我在colorConverter上断点时,我正在上课。 不是propNaviconFill的属性。 如果我在ViewModel上使用Brush类创建另一个属性并将其绑定到Fill,就没有问题。 但这意味着我没有遵循正确的MVVM结构。 再次感谢。
您应该绑定到视图模型的属性。
<Path Fill="{Binding propNaviconFill, Converter={StaticResource colorConverter}}"/>
使用将INotifyPropertyChanged
实现为视图的数据上下文的视图模型。
DataContext = new mMainScreen();
如果您确实要使用vmMainScreen
作为数据上下文,则vmMainScreen
应该在那里实现INotifyPropertyChanged
,并且您应该研究如何使用NotifyPropertyChanged
通知视图视图模型属性已更改。
请记住,MVVM有两种基本类型:1.首先查看2.首先查看模型
根据您的示例,您尝试执行“视图优先”。 这易于实现,但在较大的项目中也有缺点,因为视图控制着ViewModel的创建,因此很难将数据或状态注入到ViewModel中。
对于所有MVVM模式,您可以分为三个部分:
模型 -基本上是一个状态包。 这件事就像大多数情况下实现INotifyProperty更改的客户类。
ViewModel-类似于MVC中的控制器类。 它具有所有真实的逻辑并可以正常工作。
视图 -这是您的XAML,仅包含表示逻辑。 如果要使用View First,则不应使用代码隐藏类(即MyWindow.xaml.cs),除非要设置ViewModel。 (当然也有例外,但通常基本上应该是空的)
对于“首先查看”,您的窗口(或控件)应在构造函数中创建ViewModel并将其分配给DataContext。
您的ViewModel将具有ICommand的ObservableCollections,并且可以绑定到View中的控件。 因此,当您的构造函数触发时,您会填充数据并将其放入必要的结构中; 由于数据绑定,它与视图相关并显示。
您的模型(通常有多个模型,可以有Customer,Order,StockTicker或其他任何东西。)这些模型是由ViewModel创建的,并放入诸如ObservableCollections之类的东西供View进行数据绑定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.