我目前有一个包含各种形式数据的简单类,为了解决这个问题,我将其称为MyData
。该类通常在容器的资源部分下的xaml中创建。它目前有DependencyProperty
名为Show
,表示其数据是否应在UI中可见。此资源的一个常见用途是模板TextBlock
以显示数据并使用转换器将Show
绑定到其Visibility
。 Show
本身的值通常来自另一个DependencyProperty
(通常在用于MVVM实现的ViewModel中)。我有一个例子如下所示。
<navigation:Page.Resources>
<ViewModel x:Name="MyModel"/>
<MyData Data="Some Sample Data" Show="{Binding ModelValue, ElementName=MyModel}"/>
<DataTemplate>
<TextBlock Text={Binding Data} Visibility="{Binding Show, Converter={StaticResource BoolToVisibilityConverter}}"/>
</DataTemplate>
</navigation:Page.Resources>
上面的场景显然是我目前正在进行的工作的简化版本,但它目前运行良好。但是,我需要允许多个绑定来影响数据的可见性。为了澄清,当且仅当所有值都为真时,才应显示数据。所以,上面的MyData xaml看起来更像是这样:
<MyData Data="Some Sample Data">
<MyData.Show>
<AnotherClass Value="{Binding ModelValue1, ElementName=MyModel}"/>
<AnotherClass Value="{Binding ModelValue2, ElementName=MyModel}"/>
</MyData.Show>
</MyData>
我的第一个想法是让Show
成为ObservableCollection<bool>
,但它不会跟踪其项目的值是否发生变化,只有项目本身发生变化时才会发生变化。例如,当'ModelValue1'从true变为false时,不会引发集合的CollectionChanged
事件。所以,我需要一种方法来利用多个绑定来确定某些东西的可见性。
我意识到这是一个相当长的问题,但它有点复杂,所以我试着尽可能详细。请随时让我澄清一切。
答案 0 :(得分:0)
我认为您对ObservableCollection<bool>
的想法可能实际上运作正常,但是只需要一个小修正案。我会创建类似ObservableCollection<SomeBoolEncapsulation>
的内容,其中SomeBoolEncapsulation
实现INotifyPropertyChanged
。当SomeBoolEncapsulation
的内部bool的值改变时,只是提高了属性。当您从CollectionChanged
附加/分离处理程序收到ObservableCollection
事件到收集项的PropertyChanged
时,就会知道bool值何时发生变化。然后,当绑定到viewmodel的bool属性时,使用转换器将bool从VM封装到SomeBoolEncapsulation
。希望这会有所帮助。