2017-06-21 105 views
0

我想学习MVVM。我理解这个概念,然而,我对这个绑定感到困惑。我不确定在哪里绑定我的Fill属性。请帮忙。 Tqvm先进。Wpf绑定混淆

视图 - 名称:MainScreen.xaml

<Path Fill="{Binding mainScreenClass, Converter={StaticResource colorConverter}}"/> 

inCodeBehind

DataContext = new vmMainScreen(); 

视图模型 - 名称: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的正确结构。再次感谢。

回答

3

你应该绑定到你的视图模型的属性。

<Path Fill="{Binding propNaviconFill, Converter={StaticResource colorConverter}}"/> 

使用实现INotifyPropertyChanged的视图模型作为视图的数据上下文。

DataContext = new mMainScreen(); 

如果你真的想用vmMainScreen为您的数据环境,然后vmMainScreen应该实现INotifyPropertyChanged那里,你应该研究如何NotifyPropertyChanged来通知视图,视图模型属性已更改。

+0

oo所以datacontext的观点应该去模型?那是MVVM的正确结构吗?查看 - >型号 - >视图模型?对于INotifyPropertyChanged,我想我已经设法通知ViewModel中现有属性的更改视图。我使用Brush类创建了一个属性,我的视图绑定到属性,并且它已经可以工作。 –

+0

@ArifSam MVVM(模型视图视图模型)是一种模式,其中视图模型是视图和模型之间的粘合代码,因此视图不必直接与模型交互,反之亦然。只有视图模型应该实现'INotifyPropertyChanged'。模型应该只是POCO(简单的旧CLR对象)类,只需要很少或没有操作。让您的视图模型为您的模型执行操作。 –

+0

我真的有点太糊涂了。哈哈。对不起,如果我继续问同样的问题。根据你的回答,我需要将dataContext附加到Model中?基于此,Model属性的任何更改都应该通知View。然而,主要的操作,这意味着我的命令是在ViewModel和我的ViewModel构造函数没有被调用,因为我们已经改变了dataContext = new Model();.我们在哪里实例化ViewModel?再次感谢你。 –

1

记住有两种基本类型的MVVM:根据您的例子中,你正在尝试做检视首 1.检视首 2.视图模型首先

。这很容易实现,但在较大的项目中存在缺陷,因为该视图控制ViewModel的创建,所以将数据或状态注入ViewModel更困难。

对于所有MVVM模式,你有三个部分:

模式 - 基本上的状态袋。这件事就像一个客户类,大多数时候实现INotifyProperty实现了改变。

ViewModel - 这就像MVC中的控制器类。它具有所有真实的逻辑并完成工作。

查看 - 这是您的XAML,它只包含表示逻辑。代码隐藏类即:MyWindow.xaml.cs不应该使用,除非设置ViewModel,如果你去查看优先。 (当然有例外,但一般应该基本上是空的)

对于检视首 你的窗口(或控制)应在构造函数创建视图模型,并将其分配到DataContext。

您的ViewModel将具有ICommand,ObservableCollections等可以绑定到视图中的控件。所以当你的构造函数触发时,你填充你的数据并将其放入必要的结构中;由于数据绑定这与View和显示有关。

你的模型(你通常有多个,可以有Customer,Order,StockTicker或其他)。这些是由ViewModel创建的,并放入诸如ObservableCollections之类的数据绑定视图。

+0

非常感谢您的信息。我很困惑ViewModel是否允许在MVVM概念中创建诸如“public string name {get; set;}”之类的属性。因为这种属性通常驻留在Model中。然后,我不知道在哪里绑定,因为我的属性都存在于模型中,我的View DataContext位于ViewModel上。哈哈。无论如何,感谢您的帮助。 –