我目前正在使用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
答案 0 :(得分:1)
您需要调用实现INotifyPropertyChanged
的方法。在您的情况下,您希望将其实施到MySharedEntity
,然后设置为AnyStringMember
的{{1}}的设置者。
答案 1 :(得分:0)
我将文本框绑定到一个不实现任何INPC行为的属性。是的,它引用相同的对象,但如果没有实现INPC行为,则无法通知图形组件需要刷新。
我将绑定到MainViewModel中的属性并在那里实现INPC。