2

在我的应用程序中,我有一个堆栈面板,我想保持隐藏(或折叠,在需要它之前让它看不见),并且当用户单击按钮时它会变得可见。

使用我对 MVVM 技术的基本知识,我遇到的问题是将堆栈面板的可见性绑定到我的视图模型中的属性。该属性是 Visibility 类型,并且按钮使用自定义命令,利用 ICommand 接口调用我的视图模型中的方法,在这个阶段,它只是改变了 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 和一般编程很陌生。

我在很短的时间内学到了很多东西,但有时我确实碰到了这样的砖墙。

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

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

谢谢您的帮助。

4

2 回答 2

0

您需要做的是在您的INotifyPropertyChangedViewModel中实现:

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 接口,并在 FirstName 更改时引发 PropertyChanged事件。要在绑定客户端和数据源之间的绑定中发生更改通知,您的绑定类型应该:

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

不要两者都做。

于 2013-05-16T08:28:07.903 回答
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 接口的信息 实现 INotifyPropertyChanged - 是否存在更好的方法?

.net 4.5 略有不同。我没用过4.5,所以不能给出反馈

于 2013-05-16T08:34:49.370 回答