WPF,MVVM设计冗长的绑定考虑因素

时间:2015-10-02 19:33:06

标签: wpf entity-framework mvvm binding

我目前正在使用MVVM方法和实体框架编写WPF应用程序。

在我的MainVindow.xaml中,我左侧有一个导航系统。 对于其每个导航项,都有相应的用户控件。 单击其中一个项目将显示主窗口右侧的用户控件。

我有一个每个用户控件的视图模型。 我将MainWindow.xaml绑定到MainViewModel类的实例。

每个用户控件都绑定到其对应的viewmodel的一个实例,该实例存储在我的MainViewModel类中。

在每个用户控件viewmodel的构造函数中,我传递了MainViewModel。

这个想法是在所有这些视图模型中共享一个实体:

class MainViewModel
{
    public SharedEntity MySharedEntity
    {
        get
        {
            return _mySharedEntity;
        }
        set
        {
            InpcLogic(_mySharedEntity);
        }
    }

    public FirstUserControlViewModel MyFirstUserControlViewModel
    {
        get
        {
            if (_myFirstUserControlViewModel == null)
                _myFirstUserControlViewModel = new FirstUserControlViewModel(this);
            return _myFirstUserControlViewModel;
        }
    }
}

这样,在FirstUserControlViewModel实例中,我可以这样访问MySharedEntity:

class FirstUserControlViewModel
{
    MainViewModel _mainViewModel;

    public MainViewModel MyMainViewModel
    {
        get
        {
            return _mainViewModel;
        }
    }

    public SharedEntity MyMainViewmodelSharedEntity
    {
        get
        {
            return _mainViewModel.MySharedEntity;
        }
    }

    public FirstUserControlViewModel(MainViewModel mainViewModel)
    {
        _mainViewModel = mainViewModel;
    }
}

在我的用户控件xaml(绑定到上面的视图模型)中,我可以从mainViewModel将控件绑定到此共享实体。

现在,这是我的问题:当我从应用程序的任何位置更改共享实体时,绑定并不总是在用户控件级别刷新。可能是因为INPC逻辑在主视图模型而不是用户控件视图模型中吗?

假设我在第一个用户控件中绑定了一个文本块,如下所示:

<TextBox Text="{Binding MyMainViewModel.MySharedEntity.AnyStringMember,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />

工作正常。

但是,如果我执行以下操作

<TextBox Text="{Binding MyMainViewmodelSharedEntity.AnyStringMember,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />

然后,当我更改共享实体时,绑定不会刷新。它在两种情况下都对我的实体使用相同的引用,不是吗?

**

更新

**

以下是我最终要做的事情:

在我的MainViewModel中,我有以下属性:

public class MainViewModel 
{
    EntityFrameworkClass _myPrivateEfObject;
    EntityFrameworkNavigationPropertyClass _myPrivateEfNavigationPropertyObject;


    public EntityFrameworkClass MyPublicEfObject
    {
        get
        {
            return _myPrivateEfObject;
        }
        set
        {
            InpcLogic(ref _myPrivateEfObject, value);
            MyPublicEfNavigationPropertyObject = _myPrivateEfObject.EntityFrameworkNavigationPropertyClass.FirstOrDefault();
        }
    }
    public EntityFrameworkNavigationPropertyClass MyPublicEfNavigationPropertyObject
    {
        get
        {
            return _myPrivateEfNavigationPropertyObject;
        }
        set
        {
            InpcLogic(ref _myPrivateEfNavigationPropertyObject, value);
        }
    }
}

然后在我的用户控件xaml中,我只使用MainViewModel.MyPublicEfNavigationPropertyObject

2 个答案:

答案 0 :(得分:1)

您需要调用实现INotifyPropertyChanged的方法。在您的情况下,您希望将其实施到MySharedEntity,然后设置为AnyStringMember的{​​{1}}的设置者。

答案 1 :(得分:0)

我将文本框绑定到一个不实现任何INPC行为的属性。是的,它引用相同的对象,但如果没有实现INPC行为,则无法通知图形组件需要刷新。

我将绑定到MainViewModel中的属性并在那里实现INPC。