在我的程序中,当我的另一个contentPresenter获得焦点时,我想禁用一个contentPresenter。每个presenter都由位于我的MainWindowViewModel中的属性表示。这也是两个presenter的IsEnabled属性所在的位置。
两个contentPresenters都是使用以下结构创建的:UserControl -> ViewModel -> Data Model。
现在,我正在尝试通过从获取焦点的contentPresenter的代码后台更改主窗口的ViewModel中的IsEnabled属性来禁用必要的contentPresenter。
contentPresenter用户控件代码后台:
这行代码:
如果这不是正确的解决方案,请告诉我并帮我修复。
谢谢
更新1:
我的完整基类:
两个contentPresenters都是使用以下结构创建的:UserControl -> ViewModel -> Data Model。
现在,我正在尝试通过从获取焦点的contentPresenter的代码后台更改主窗口的ViewModel中的IsEnabled属性来禁用必要的contentPresenter。
contentPresenter用户控件代码后台:
public partial class EditBlockUC : UserControl
{
public EditBlockViewModel ViewModel { get { return DataContext as EditBlockViewModel; } }
public EditBlockUC()
{
InitializeComponent();
}
//Runs when the user control gets focus
private void UserControl_GotFocus(object sender, RoutedEventArgs e)
{
//This UserControl has access to MainWindowViewModel through
//it's own ViewModel, EditBlockViewModel
ViewModel.MainViewModel.LeftWidgetEnabled = false;
}
}
这行代码:
ViewModel.MainViewModel.LeftWidgetEnabled = false;
可以成功地改变主窗口视图模型中的属性,但是视图没有被影响。如果我找到一种方法调用NotifyPropertyChange()
,能否解决这个问题?如果可以,怎么做?如果这不是正确的解决方案,请告诉我并帮我修复。
谢谢
更新1:
我的完整基类:
public class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
public virtual void NotifyPropertyChange<TProperty>(Expression<Func<TProperty>> property)
{
var lambda = (LambdaExpression)property;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else
memberExpression = (MemberExpression)lambda.Body;
OnPropertyChanged(memberExpression.Member.Name);
}
protected bool SetField<T>(ref T field, T value, string propertyName)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}
更新2:
我的LeftWidgetEnabled
属性:
public bool LeftWidgetEnabled
{
get { return _leftWidgetEnabled; }
set { SetField(ref _leftWidgetEnabled, value, "LeftWidgetEnabled"); }
}
LeftWidgetEnabled
属性的get
方法上设置了一个断点,但程序从未停在那里。 - Eric after dark