我试图在MVVM上学习。我理解这个概念,然而,我对绑定感到困惑。我不知道在哪里绑定我的Fill属性。请帮忙。 Tqvm在先进。
查看 - 名称:MainScreen.xaml
<Path Fill="{Binding mainScreenClass, Converter={StaticResource colorConverter}}"/>
inCodeBehind
DataContext = new vmMainScreen();
ViewModel - name: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的正确结构。再次感谢。
答案 0 :(得分:3)
您应该绑定到视图模型的属性。
Image copyCrop(Image src, int x, int y, int w, int h);
使用实现<Path Fill="{Binding propNaviconFill, Converter={StaticResource colorConverter}}"/>
的视图模型作为视图的数据上下文。
INotifyPropertyChanged
如果您确实希望使用DataContext = new mMainScreen();
作为数据上下文,那么vmMainScreen
应该在那里实现vmMainScreen
,您应该研究如何使用INotifyPropertyChanged
来通知视图视图模型属性已更改。
答案 1 :(得分:1)
请记住MVVM有两种基本类型: 1.先查看 2.查看模型优先
根据您的示例,您尝试执行View First。这更容易实现,但是在大型项目中存在缺点,因为视图控制ViewModel的创建,因此将数据或状态注入ViewModel更加困难。
对于所有MVVM模式,您有三个部分:
模型 - 基本上是一个状态包。这个东西就像一个客户类,大多数时候它实现了INotifyProperty的改变。
ViewModel - 这就像MVC中的控制器类。它具有所有真实的逻辑并完成工作。
查看 - 这是您的XAML,它只保存演示逻辑。代码隐藏类即:MyWindow.xaml.cs不应该被使用,除非设置ViewModel,如果你的View First。 (当然也有例外,但一般来说它基本上应该是空的)
对于View First 您的Window(或控件)应该在构造函数中创建ViewModel并将其分配给DataContext。
您的ViewModel将具有ICommand,ObservableCollections等可以绑定到View中的控件。因此,当您的构造函数触发时,您将填充数据并将其放入必要的结构中;因为数据绑定,这与视图相关并显示。
您的模型(您通常拥有多个,可以拥有Customer,Order,StockTicker或其他任何东西。)这些是由ViewModel创建的,并放入ObservableCollections之类的东西,以便View to databind to。