我使用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>
有什么想法吗?
答案 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
属性绑定到ObjectDataProvider
。
MethodParameters
属性指定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}"/>
这也适用于网格标题......