具有绑定的WPF可见性资源

时间:2013-04-19 13:34:31

标签: wpf xaml resources visibility .net-4.5

我使用MVVM Light获得了一个WPF应用程序。在一个视图中,我得到了许多使用相同可见性绑定的控件。因为我不想将我的长绑定路径插入每个控件。我想使用资源......

<SomeControl>
  <SomeControl.Resource>
    <Visibility x:Key="myVisibilityResource" >
        <Binding Path="somePath" Converter="BoolToVisibilityConverter"></Binding>
    </Visibility>
  </SomeControl.Resource>
<SomeControl>

使用此版本,我会收到Visibility不支持直接内容的错误。我必须这样写:

<Visibility x:Key="myVisibilityResource" >
    Collapsed
</Visibility>

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

如果您想要的只是能够在XAML中编写“Visible”或“Collapsed”(如上一个示例所示),您可以通过绑定到使用{{3}的ObjectDataProvider来实现。解析给定的文本(可以是“Visible”,“Collapsed”或“Hidden”):

<Grid xmlns:sys="clr-namespace:System;assembly=mscorlib" >
    <Grid.Resources>
        <ObjectDataProvider x:Key="visibilityProvider"
                MethodName="Parse" 
                ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="Visibility" />
                <sys:String>Visible</sys:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Grid.Resources>

    <Button x:Name="button1" Visibility="{Binding Source={StaticResource visibilityProvider}}" />

</Grid>

在上面的代码中,我使用ObjectDataProvider来返回Enum.Parse枚举。绑定时ObjectDataProvider调用Enum.Parse。按钮的Visibility属性绑定到ObjectDataProviderMethodParameters属性指定Enum.Parse的参数。

不幸的是,无法将MethodParameters直接绑定到基础ViewModel。如果你想这样做,我想你可以编写自己的ObjectDataProvider,或者你可以使用自己的类/方法而不是Enum.Parse来返回正确的Visibility值。

答案 1 :(得分:1)

这样的事情怎么样?这并不是你要求的,但是你会复制较少的代码,因为你不必每次都包含转换器。

<UserControl>
  <Grid>
    <SomeElement x:Name="Master" Visibility="{Binding somePath, Converter={StaticResource BoolToVisibilityConverter}}" />
    <SomeOtherElement Visibility="{Binding Visibility, ElementName=Master}" />
    <SomeOtherElement Visibility="{Binding Visibility, ElementName=Master}" />
  </Grid>
</UserControl>

答案 2 :(得分:1)

在资源中创建一个样式:

<Style TargetType="Control" x:Key="VisibilityStyle">
            <Setter Property="Visibility" 
 Value="{Binding Converter={StaticResource VisibleIfFalse}}"/>
</Style>

然后只需添加对项目的引用即可隐藏/显示。

<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>

这也适用于网格标题......