具有绑定的WPF可见性资源

具有绑定的WPF可见性资源,wpf,xaml,resources,visibility,.net-4.5,Wpf,Xaml,Resources,Visibility,.net 4.5,我得到了一个使用MVVM Light的WPF应用程序。在一个视图中,我得到了许多使用相同可见性绑定的控件。因为我不喜欢将我的长绑定路径插入每个控件。我想使用一个资源 <SomeControl> <SomeControl.Resource> <Visibility x:Key="myVisibilityResource" > <Binding Path="somePath" Converter="BoolToVisibility

我得到了一个使用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>

崩溃

有什么想法吗

如果您希望能够在XAML中写入“可见”或“折叠”(如上一个示例中所示),则可以通过绑定并使用它来解析给定文本(可以是“可见”、“折叠”或“隐藏”):


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


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

类似的内容如何?这并不完全是您所要求的,但是您将复制更少的代码,因为您不必每次都包含转换器

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

在参考资料中创建样式:

<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}"/>


这也适用于网格的标题…

您能将其定义为字符串并这样调用吗?这是一种资源
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>
<TextBlock Text="123" Style="{StaticResource VisibilityStyle}"/>