UserControl通过ViewModel绑定可见性

时间:2009-08-29 11:52:23

标签: silverlight mvvm

Silverlight应用的简化架构:

  • 的MainPage; DataContext设置为MainViewModel
  • MainPage有两个元素:UserControl和Rectangle
  • 在MainViewModel中,我有两个属性,UserControlVisible和RectVisible,两者都是Visibility类型,绑定到MainPage.XAML中这两个元素的Visibility属性
  • MainViewModel已实施INotifyPropertyChanged

问题是,当我在MainViewModel中将RectVisible属性设置为Visibility.Collapsed时,Rectangle隐藏,这很好,但是当我将Visibility.Collapsed设置为UserControl(UserControlVisible属性)时,它永远不会隐藏!
我无法隐藏该用户控件,我必须通过我的ViewModel类来完成它。为什么它适用于Rectangle元素,但不适用于UserControl?当我在XAML中手动将Visibility设置为Collapsed时,它是隐藏的,但我必须通过代码和ViewModel对象来完成。

(编辑)临时溶解:

我手动订阅了codebehind

中的PropertyChanged事件
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    viewmodel=new MainViewModel();
    this.DataContext = viewmodel;
    // fix for binding bug:
    viewmodel.PropertyChanged += viewmodel_PropertyChanged;
}

void viewmodel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "LoginVisible")
        loginWindowControl.Visibility = viewmodel.LoginVisible;
}

2 个答案:

答案 0 :(得分:1)

我有同样的问题,我修复了它,我不知道我的解决方案是否适合你。 我的“MainPage”的datacontext与UserControl的datacontext不同。 我通过XAML手动为我的usercontrol设置了datacontext 我举一个例子:

<local:myusercontrol  DataContext="myusercontroldatacontext" Visibiltiy="{Binding Path=VisibleProperty}"/>

这种情况下的VisibleProperty应该属于myusercontroldatacontext,而不是定义父xaml的datacontext

答案 1 :(得分:0)

您可能需要找到一种方法将Visibility属性绑定到用户控件的视觉效果(Grid / Panel)的根目录。