无法通过控制改变控制可见性

时间:2013-05-16 08:16:58

标签: .net wpf mvvm

在我的应用程序中,我有一个堆栈面板,我想保持隐藏(或折叠,无论是什么让它看不见,直到需要它),并在用户点击按钮时显示它。

使用我对MVVM技术的基本知识,我遇到的问题是将stackpanel的可见性绑定到我的viewmodel中的属性。该属性是一个Visibility类型,该按钮使用一个自定义命令,利用ICommand接口调用我的viewmodel中的方法,在此阶段,该方法只是改变了stackpanel绑定的visibility属性的值。

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

我将尝试构建我正在使用的代码的说明性示例:

<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" />
<StackPanel Visibility="{Binding Path=panelVisibility}" />

在viewmodel中的Command调用的方法中:

public Visibility panelVisibility { get; set; }

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

我对C#/ .NET和一般编程都很陌生。

我在很短的时间内学到了很多东西,但偶尔我会像这样碰到一堵砖墙。

一些指导性的协助对我来说非常宝贵。

我愿意接受更好/更有效的技术建议来实现我在这个问题中概述的结果,但为了我理解的利益,我想知道我错过了什么或做错了什么试图用这种特殊的方式。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要做的是在ViewModel中实施INotifyPropertyChanged

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接口用于通知客户端,   通常是绑定客户端,属性值已更改。对于   例如,考虑具有名为FirstName的属性的Person对象。至   提供通用属性更改通知,Person类型   实现INotifyPropertyChanged接口并引发一个   PropertyChanged   更改FirstName时的事件。用于在a中发生变更通知   绑定客户端和数据源之间的绑定,绑定类型   应该:

     
      
  • 实现INotifyPropertyChanged接口(首选)。
  •   
  • 为绑定类型的每个属性提供更改事件。
  •   
     

不要两者兼顾。

答案 1 :(得分:0)

假设您使用的是.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接口的信息 Implementing INotifyPropertyChanged - does a better way exist?

.net 4.5略有不同。我没有使用4.5,所以无法提供反馈