Wpf绑定混乱

时间:2017-06-21 01:57:11

标签: c# wpf xaml mvvm

我试图在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的正确结构。再次感谢。

2 个答案:

答案 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。