这不是一个大问题,但我想了解更多关于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资源?
答案 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 ,未经过测试。