【发布时间】:2013-11-05 14:47:36
【问题描述】:
在我的程序中,当我的另一个 contentPresenter 获得焦点时,我想禁用 contentPresenter。每个演示者都由位于我的MainWindowViewModel 中的属性表示。这也是两位演示者的 IsEnabled 属性所在的位置。
contentPresenters 均使用以下结构创建:UserControl -> ViewModel -> Data Model。
现在我正在尝试通过更改主窗口 ViewModel 中的 IsEnabled 属性来禁用必要的 contentPresenter,方法是从获得焦点的 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"); }
}
【问题讨论】:
-
你在 SetField 之后到达了 LeftWidgetEnabled 的 getter 吗?请发布您的 LeftWidgetEnabled 属性。
-
我只是在我的
LeftWidgetEnabled属性中的get处设置了一个断点,并且程序从未停止过。 -
这意味着您的 PropertyChanged 事件从未在实现 INotifyPropertyChanged 和 SetField 方法的基类之后引发。
-
你有没有调试过这个并检查属性更改是否不为空并且给出了正确的属性名称?
标签: c# wpf mvvm inotifypropertychanged