C# 设置用户控件可见性

C# 设置用户控件可见性,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一个不具有约束力的属性,无法找出问题所在。有人能帮忙吗?我的转换器正在为其他绑定控件运行,因此没有问题。设置断点时,我从未看到属性IsMyControl Visible被命中 我将此行添加到属性MyControlViewModels中: this.NotifyPropertyChanged(m => m.IsMyControlVisible); 当它被命中时,它会导致我的属性集被命中,但控件的可见性不会发生任何变化,即使我可以看到值为true。该控件是完全功能性的,我只是无法让它以

我有一个不具有约束力的属性,无法找出问题所在。有人能帮忙吗?我的转换器正在为其他绑定控件运行,因此没有问题。设置断点时,我从未看到属性IsMyControl Visible被命中

我将此行添加到属性MyControlViewModels中:

this.NotifyPropertyChanged(m => m.IsMyControlVisible); 
当它被命中时,它会导致我的属性集被命中,但控件的可见性不会发生任何变化,即使我可以看到值为true。该控件是完全功能性的,我只是无法让它以编程方式显示。此外,我的可见性转换器适用于其他视图,因此这不是问题所在

看起来(对我来说)绑定设置不正确,如果我能让它工作,控件的可见性就会工作

我的控件位于TabControl中,TabControl位于我视图上的网格中

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

ConfigurationEditorView.xaml:

<ctrls:MyControl Grid.Row="0" 
    Visibility="{Binding Path=IsMyControlVisible, 
    Converter={StaticResource booleanToStringConverter},
    FallbackValue=Hidden}" />
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);
    }
}

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

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

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

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

在编写代码时,只有当有人将
ObservableCollection
的新实例分配给您的
MyControlViewModels
属性时,才会收到通知。相反,在setter中,您可以在创建视图模型的任何地方编写

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

    this.myControlViewModels = value;

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

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


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

在编写代码时,只有当有人将
observeCollection
的新实例分配给
MyControlViewModels
属性时,才会收到通知。相反,在setter中,您可以在创建视图模型的任何地方编写

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

    this.myControlViewModels = value;

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

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


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

在编写代码时,只有当有人将
observeCollection
的新实例分配给
MyControlViewModels
属性时,才会收到通知。相反,在setter中,您可以在创建视图模型的任何地方编写

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

    this.myControlViewModels = value;

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

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


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

在编写代码时,只有当有人将
observeCollection
的新实例分配给
MyControlViewModels
属性时,才会收到通知。相反,在setter中,您可以在创建视图模型的任何地方编写

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

    this.myControlViewModels = value;

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

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


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

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

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

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

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

您在哪里向ObservableCollection添加项?无论何时添加或删除项,都必须对IsmyControl Visible进行属性更改。另外,如果您怀疑绑定有问题,您应该检查输出窗口中的绑定错误。我正在引发属性更改…this.NotifyPropertyChanged(m=>m.IsMyControlVisible);我会检查我的输出,看看我是否看到了什么。谢谢。您在哪里向ObservableCollection添加项目?无论何时添加或删除项,都必须对IsmyControl Visible进行属性更改。另外,如果您怀疑绑定有问题,您应该检查输出窗口中的绑定错误。我正在引发属性更改…this.NotifyPropertyChanged(m=>m.IsMyControlVisible);我会检查我的输出,看看我是否看到了什么。谢谢。您在哪里向ObservableCollection添加项目?无论何时添加或删除项,都必须对IsmyControl Visible进行属性更改。另外,如果您怀疑绑定有问题,您应该检查输出窗口中的绑定错误。我正在引发属性更改…this.NotifyPropertyChanged(m=>m.IsMyControlVisible);我会检查我的输出,看看我是否看到了什么。谢谢。您在哪里向ObservableCollection添加项目?你将不得不提出一项财产变更申请