Есть ли лучший / менее подробный способ объявить эту повторную привязку WPF? - PullRequest
2 голосов
/ 17 июня 2011

Это не большое дело, но я хотел бы узнать больше о 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 голосов
/ 17 июня 2011

Создайте стиль и примените его к своим столбцам.

Где-нибудь в своих ресурсах создайте стиль:

<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-подобный псевдоксамль и не тестируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...