我有一个没有绑定的属性,无法找出问题所在。有人可以帮忙吗?我的转换器正在运行其他绑定控件,因此没有问题。设置断点时,我从未看到属性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);
}
答案 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的枚举,而不是字符串。