繁体   English   中英

WPF绑定混乱

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM