.net 从控件更改控件可见性时出现问题

.net 从控件更改控件可见性时出现问题,.net,wpf,mvvm,.net,Wpf,Mvvm,在我的应用程序中,我有一个stackpanel,我想隐藏它(或者折叠起来,在需要之前不让它出现),当用户点击一个按钮时,它就会变得可见 使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到viewmodel中的属性。属性是可见性类型,按钮使用自定义命令,利用ICommand界面调用my viewmodel中的方法,在本阶段,该方法仅更改stackpanel绑定到的可见性属性的值 我已经确认命令本身正在成功调用该方法,并且visibility属性正在更改,但是我已将v

在我的应用程序中,我有一个stackpanel,我想隐藏它(或者折叠起来,在需要之前不让它出现),当用户点击一个按钮时,它就会变得可见

使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到viewmodel中的属性。属性是可见性类型,按钮使用自定义命令,利用ICommand界面调用my viewmodel中的方法,在本阶段,该方法仅更改stackpanel绑定到的可见性属性的值

我已经确认命令本身正在成功调用该方法,并且visibility属性正在更改,但是我已将visibility属性绑定到的stackpanel拒绝变为可见

我将尝试构建一个我正在使用的代码的示例:

<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" />
<StackPanel Visibility="{Binding Path=panelVisibility}" />
我对C#/.NET和一般编程都是新手

我在很短的时间里学到了很多,但偶尔我也会遇到这样的困难

一些有指导的帮助对我来说是无价的

我愿意接受关于更好/更有效的方法的建议,以实现我在这个问题中概述的结果,但出于我的理解,我想知道我在尝试使用这种特殊方法时遗漏了什么或做错了什么


谢谢您的帮助。

您需要做的是在您的
视图模型中实现:

public class YourViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public void ShowThePanel()
    {
        PanelVisibility = Visibility.Visible;
    }

    private Visibility panelVisibility;

    public Visibility PanelVisibility
    {
        get
        {
            return panelVisibility
        }
        set
        {
            panelVisibility = value;
            OnPropertyChanged("PanelVisibility");
        }
    }
}
然后在
XAML
中:

<StackPanel Visibility="{Binding Path=PanelVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

编辑:

INotifyPropertyChanged接口用于通知客户端, 通常绑定客户端时,属性值已更改。对于 例如,考虑一个具有FieldNew属性的对象对象。到 提供通用属性更改通知,人员类型 实现INotifyPropertyChanged接口并引发 更改名字时发生的事件。对于要在中发生的更改通知 绑定客户端和数据源之间的绑定,您的绑定类型 应:

  • 实现INotifyPropertyChanged接口(首选)
  • 为绑定类型的每个属性提供更改事件
不要两者都做


假设您使用的是.net 4或更低版本,并且已经在viewModel基类中设置了INotifyPropertyChanged代码,并在panelVisibility属性的setter方法中调用它

INotifyPropertyChanged是一种允许绑定通知侦听控件需要更改的机制

示例基础视图模型

public class baseViewModel : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
这里还有一堆关于如何实现和调用iNotifyPropertyChanged接口的信息


.NET4.5略有不同。我没有使用4.5,因此无法对其进行反馈

@Sandwich您需要一种方法来通知UI属性的值已更改,这只是一种方法(MVVM 101)。带有
OnPropertyChanged(“PanelVisibility”)在您的
集合
下,它会将更改通知UI。使用自动属性时,不会将ViewModel中的任何更改通知UI。
public class baseViewModel : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}