gpt4 book ai didi

c# - 我需要在代码隐藏中调用 INotifyPropertyChanged() 吗?

转载 作者:行者123 更新时间:2023-11-30 15:31:59 24 4
gpt4 key购买 nike

在我的程序中,我想禁用 contentPresenter当我的另一个contentPresenter获得焦点。每个演示者都由位于我的 MainWindowViewModel 中的一个属性表示.这也是 IsEnabled 的地方属性位于两个演示者。

两者都是 contentPresenters使用以下结构创建:UserControl -> ViewModel -> Data Model。

现在我正在尝试禁用必要的 contentPresenter通过更改 IsEnabled来自 contentPresenter 的代码隐藏的主窗口 ViewModel 中的属性得到关注。

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;成功更改主窗口 View 模型中的属性,但 View 不受影响。我可以通过找到调用 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"); }
}

最佳答案

ViewModel.MainViewModel 类的 LeftWidgetEnabled 必须是这样的:

private bool leftWidgetEnabled;
public bool LeftWidgetEnabled
{
get { return leftWidgetEnabled; }
set { SetField(ref leftWidgetEnabled, value, "LeftWidgetEnabled"); }
}

此外,您的 MainViewModel 必须实现 INotifyPropertyChanged .

最好让 MainViewModelViewModelBase 继承并让 ViewModelBase 实现 INotifyPropertyChanged .

public class MainViewModel : ViewModelBase
{
private bool leftWidgetEnabled;
public bool LeftWidgetEnabled
{
get { return leftWidgetEnabled; }
set { SetField(ref leftWidgetEnabled, value, "LeftWidgetEnabled"); }
}
}

public class ViewModelBase : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
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;
}
}

更新 1

然后您的 ContentPresenter 应该像这样绑定(bind):

<ContentPresenter IsEnabled="{Binding Path=LeftWidgetEnabled}" />

虽然 UserControlDataContext(ContentPresenter 开启)应该是 MainViewModel 的一个实例.

例如:

<UserControl 
x:Class="MyApplication.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="**PATH TO YOUR VIEWMODELS-ASSEMBLY**"
mc:Ignorable="d">

<UserControl.DataContext>
<viewModels:MainViewModel />
</UserControl.DataContext>

<ContentPresenter IsEnabled="{Binding Path=LeftWidgetEnabled}" />
</UserControl>

关于c# - 我需要在代码隐藏中调用 INotifyPropertyChanged() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com