是否有更好/更简洁的方式来声明这个重复的WPF绑定?

时间:2011-06-17 14:32:41

标签: wpf xaml mvvm

这不是一个大问题,但我想了解更多关于WPF的信息,我想知道是否有一种不那么详细的方法来处理以下问题。我设置了XAML代码(下面的代码段),根据源对象ShowAdvancedContent的布尔属性wndState显示和隐藏数据网格中的列。数据网格本身绑定到数据源,而不是对象wndState,所以我指定Source属性,因为我从bool转换为Visibility,我指定了Converter属性。

<locset:WindowState x:Key="wndState" />
<locdata:BooleanToVisibilityConverter x:Key="BoolToCollapsedConverter"
                                      True="Visible"  False="Collapsed" />

...

<DataGridHyperlinkColumn x:Name="urlColumn" Binding="{Binding Path=Url}"
            Header="{DynamicResource ResourceKey=urlColHdr}"
            MinWidth="100" Width="*"
            Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}">
    <DataGridHyperlinkColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick" />
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

<DataGridTextColumn x:Name="addressColumn" Binding="{Binding Path=Address}"
        Header="{DynamicResource ResourceKey=addressColHdr}"
        MinWidth="120" Width="SizeToCells"
        Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}" />

<DataGridTextColumn x:Name="portColumn" Binding="{Binding Path=Port}"
        Header="{DynamicResource ResourceKey=portColHdr}"
        MinWidth="80" Width="SizeToCells"
        Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}" />

<DataGridTextColumn x:Name="protocolVersionColumn" Binding="{Binding Path=ProtocolVersion}"
        Header="{DynamicResource ResourceKey=protocolColHdr}"
        Width="SizeToHeader"
        Visibility="{Binding Source={StaticResource wndState}, Path=ShowAdvancedContent, Converter={StaticResource ResourceKey=BoolToCollapsedConverter}, Mode=OneWay}"/>

这种方法效果很好 - 当我切换ShowAdvancedContent的值时,列会折叠并变得可见。但是,我重复这个确切的字符串四次:

Visibility="{Binding Source={StaticResource wndState},
                     Path=ShowAdvancedContent,
                     Converter={StaticResource ResourceKey=BoolToCollapsedConverter},
                     Mode=OneWay}" />

所以今天当我将属性的名称从“AdvancedColVisibility”更改为“ShowAdvancedContent”时,我不得不在四个地方更改它。 (就像我上面写的那样,并不是什么大问题。为了学习WPF,我要求的更多是关于管理这个特定的代码块。)

有没有办法声明一次绑定并在四列中的每一列上引用该声明,例如作为某种类型的绑定资源或通过Syle资源?

1 个答案:

答案 0 :(得分:0)

创建样式并将其应用于列。

在资源的某处,创建样式:

<Style
    x:Key="AdvancedColumn"
    TargetType="DataGridColumn">
    <Setter
        Property="Visibility"
        Value="{Binding ShowAdvancedContent,
                        Source={StaticResource wndState},
                        Converter={StaticResource BoolToCollapsedConverter},
                        Mode=OneWay}" />
</Style>

然后将其应用于您的列:

<DataGridTextColumn
    x:Name="addressColumn"
    Binding="{Binding Path=Address}"
    Header="{DynamicResource ResourceKey=addressColHdr}"
    MinWidth="120"
    Width="SizeToCells"
    Style="{StaticResource AdvancedColumn}"/>

注意,这是类似WPF的pseudoxaml ,未经过测试。