Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有更好/更少详细的方法来声明此重复的WPF绑定?_Wpf_Xaml_Mvvm - Fatal编程技术网

是否有更好/更少详细的方法来声明此重复的WPF绑定?

是否有更好/更少详细的方法来声明此重复的WPF绑定?,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,这不是一个大问题,但我想了解更多关于WPF的信息,我想知道是否有一种不太详细的方法来处理以下问题。我已经设置了XAML代码(下面的代码片段),以基于源对象wndState的布尔属性ShowAdvancedContent在数据网格中显示和隐藏列。数据网格本身绑定到一个数据源,而不是对象wndState,因此我指定了source属性,因为我正在从bool转换到Visibility,所以我指定了Converter属性 <locset:WindowState x:Key="wndState" /&

这不是一个大问题,但我想了解更多关于WPF的信息,我想知道是否有一种不太详细的方法来处理以下问题。我已经设置了XAML代码(下面的代码片段),以基于源对象
wndState
的布尔属性
ShowAdvancedContent
在数据网格中显示和隐藏列。数据网格本身绑定到一个数据源,而不是对象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}"/>
因此,今天当我将该属性的名称从“AdvancedColVisibility”更改为“ShowAdvancedContent”时,我不得不在四个地方进行更改。(就像我在上面写的,这不是什么大问题。我要求的更多是为了学习WPF,而不是为了管理这个特定的代码块。)


是否有一种方法可以一次性声明该绑定并在四列中的每一列引用该声明,例如作为某种类型的绑定资源或通过Syle资源?

创建一种样式并将其应用于您的列

在您的资源中的某个地方,创建以下样式:

<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的伪XAML,未经测试。

创建一个样式并将其应用于您的列

在您的资源中的某个地方,创建以下样式:

<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的伪XAML,没有经过测试。

这是我所希望的方法,但DataGridColumn及其后代没有样式属性。(DataGridColumn不从FrameworkElement或FrameworkContentElement继承)。@dVid:Yowch。。。如何将目标类型更改为DataGridCell,使用DataGridColumn.CellStyle设置样式,并将单元格的宽度设置为0?你也得做头型。有点像黑客,但它可能会工作…@dvid:它是一个DependencyObject,因此您可以创建一个Silverlight“行为”,响应绑定,折叠列。我认为这也是一个黑客,因为这需要一个附加属性,这些是静态的。您必须将所有引用打包到一个实例中,该实例将它们作为弱引用进行管理。这是我所希望的方法,但DataGridColumn及其后代没有样式属性。(DataGridColumn不从FrameworkElement或FrameworkContentElement继承)。@dVid:Yowch。。。如何将目标类型更改为DataGridCell,使用DataGridColumn.CellStyle设置样式,并将单元格的宽度设置为0?你也得做头型。有点像黑客,但它可能会工作…@dvid:它是一个DependencyObject,因此您可以创建一个Silverlight“行为”,响应绑定,折叠列。我认为这也是一个黑客,因为这需要一个附加属性,这些是静态的。您必须将所有引用打包到一个实例中,该实例将它们作为弱引用进行管理。