4

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

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

在这个版本中,我得到了可见性不支持直接内容的错误。我必须这样写:

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

有任何想法吗?

4

3 回答 3

1

如果您只想在 XAML 中编写“可见”或“折叠”(如上一个示例中所示),则可以通过绑定来完成,ObjectDataProviderEnum.Parse用于解析给定文本(可以是“可见” 、“折叠”或“隐藏”):

<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>

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

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

于 2013-04-23T12:27:12.403 回答
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>
于 2013-04-23T14:11:17.870 回答
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}"/>

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

于 2015-04-13T16:08:35.270 回答