Silverlight - 使用多个绑定确定可见性

时间:2011-12-27 04:13:45

标签: c# data-binding binding silverlight-4.0

我目前有一个包含各种形式数据的简单类,为了解决这个问题,我将其称为MyData。该类通常在容器的资源部分下的xaml中创建。它目前有DependencyProperty名为Show,表示其数据是否应在UI中可见。此资源的一个常见用途是模板TextBlock以显示数据并使用转换器将Show绑定到其VisibilityShow本身的值通常来自另一个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事件。所以,我需要一种方法来利用多个绑定来确定某些东西的可见性。

我意识到这是一个相当长的问题,但它有点复杂,所以我试着尽可能详细。请随时让我澄清一切。

1 个答案:

答案 0 :(得分:0)

我认为您对ObservableCollection<bool>的想法可能实际上运作正常,但是只需要一个小修正案。我会创建类似ObservableCollection<SomeBoolEncapsulation>的内容,其中SomeBoolEncapsulation实现INotifyPropertyChanged。当SomeBoolEncapsulation的内部bool的值改变时,只是提高了属性。当您从CollectionChanged附加/分离处理程序收到ObservableCollection事件到收集项的PropertyChanged时,就会知道bool值何时发生变化。然后,当绑定到viewmodel的bool属性时,使用转换器将bool从VM封装到SomeBoolEncapsulation。希望这会有所帮助。