2013-05-16 102 views
2

改变控制的知名度在我的申请,我有一个StackPanel我想保持隐藏(或折叠,无论保持它的视线,直到它的需要),它是将可见,当用户点击一个按钮。麻烦从控制

我碰到的,用我的MVVM技术的基础知识的问题,是有StackPanel中的知名度绑定到我的视图模型的属性。该属性是Visibility类型,并且该按钮使用一个使用ICommand接口的自定义命令来调用我的viewmodel中的方法,该方法在此阶段仅更改堆叠面板所绑定的可见性属性的值。

我已确认该命令本身是成功调用该方法,能见度属性被改变,但StackPanel的,而我已绑定了visibility属性拒绝成为可见。

我会尽力来构建我正在使用的代码的说明性的例子:

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

并按照指令在视图模型调用的方法:

public Visibility panelVisibility { get; set; } 

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

我对于C#/ .NET和一般编程来说相当新颖。

我在很短的时间量学到了很多东西,但过一段时间我做碰壁这样。

一些指导援助将是非常宝贵的我。

我打开了为实现我在这个问题概括的结果更好/更有效的技术建议,但跟你一样,我想知道我错过了还是做错了的我的理解好处同时试图使用这种特殊的方式。

感谢您的帮助。

回答

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接口用于通知客户端, 通常绑定客户端,即一个pr操作值已更改。对于 示例,请考虑具有名为FirstName的属性的Person对象。如果要 提供通用属性更改通知,则Person类型 将实现INotifyPropertyChanged接口,并在更改FirstName时引发一个事件 PropertyChanged 事件。用于绑定的客户端和一个数据源,您的bound类型之间的结合发生在一个 改变通知 应该:

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

不要这样做。

+0

@Sandwich您需要一种方法来通知UI,该属性的值已更改,这只是它的一种方式(MVVM 101)。通过'OnPropertyChanged(“PanelVisibility”);'在'set'下面,它通知UI的变化。使用自动属性时,它不会通知用户界面您ViewModel中的任何更改。 – Willem

0

假设你使用的是.NET 4个或更少,然后你必须设置你的INotifyPropertyChanged的代码在你的ViewModel基类,并把它在你的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,所以不能提供反馈