设置UserControl可见性

时间:2015-02-12 16:51:55

标签: c# wpf xaml mvvm

我有一个没有绑定的属性,无法找出问题所在。有人可以帮忙吗?我的转换器正在运行其他绑定控件,因此没有问题。设置断点时,我从未看到属性IsMyControlVisible被击中。

我将此行添加到属性MyControlViewModels:

this.NotifyPropertyChanged(m => m.IsMyControlVisible); 

当它被击中时,它会导致我的属性集被命中,但是我的控件的可见性没有任何反应,即使我可以看到值为true。控件完全正常运行,我无法以编程方式显示它。此外,我的可见性转换器适用于其他视图,因此这不是问题。

似乎(对我而言)绑定没有正确设置,如果我能使它工作,可见性将对控件起作用。

我的控件位于一个TabControl中,它位于我视图中的Grid内。

我发现这篇文章最接近我的问题并尝试了但没有成功:

UserControl Visibility binding through ViewModel

ConfigurationEditorView.xaml:

<ctrls:MyControl Grid.Row="0" 
    Visibility="{Binding Path=IsMyControlVisible, 
    Converter={StaticResource booleanToStringConverter},
    FallbackValue=Hidden}" />

ConfigurationEditorView&#39; s构造函数:

this.DataContext = new ConfigurationEditorViewModel();

ConfigurationEditorViewModel:

public bool IsMyControlVisible
{
    get
    {
        return this.MyControlViewModels.Count > 0;
    }
}

private ObservableCollection<MyControlViewModel> myControlViewModels 
    = new ObservableCollection<MyControlViewModel>();

public ObservableCollection<MyControlViewModel> MyControlViewModels
{
    get
    {
        return this.myControlViewModels;
    }

    set
    {
        this.myControlViewModels = value;

        this.NotifyPropertyChanged(m => m.myControlViewModels);

        this.NotifyPropertyChanged(m => m.IsMyControlVisible);
    }
}

ConfigurationEditorViewModel构造函数:

public ConfigurationEditorViewModel()
{
    this.MyControlViewModels.Add(new MyControlViewModel);
}

3 个答案:

答案 0 :(得分:1)

您正在使用boolToString转换器,实际上您需要可见性。

答案 1 :(得分:1)

在编写代码时,如果有人为您的ObservableCollection媒体资源分配MyControlViewModels的新实例,则只会收到通知。相反,在setter中,您可以在创建视图模型的任何地方编写,您可以添加

set
{
    if (myControlViewModels != null)
    {
        myControlViewModels.CollectionChanged -= OnControlViewModelsChanged;
    }

    this.myControlViewModels = value;

    this.NotifyPropertyChanged(m => m.IsMyControlVisible);

    if (myControlViewModels != null)
    {
        myControlViewModels.CollectionChanged += OnControlViewModelsChanged;
    }
}

,其中

public void OnControlViewModelsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    this.NotifyPropertyChanged(m => m.IsMyControlVisible);
}

另一个小问题:通常你没有类型ObservableCollection的属性的setter - 它将是get-only,你将在构造函数中创建它。这将简化您的一些代码(比如不需要取消订阅更改事件)。参见例如ItemsControl.Items(它不使用可观察的集合,模式是相同的。)

答案 2 :(得分:1)

您可以使用BooleanToVisibilityConverter。您尝试获取的值是名为Visibility的枚举,而不是字符串。