UserControl可以通过自己的XAML隐藏自己吗?

本文关键字:自己 隐藏 XAML 可以通过 自己的 UserControl | 更新日期: 2023-09-27 18:13:25

如果我有一个用户控件,我想作为一个覆盖,我希望它隐藏自己,也就是说,当它不需要的时候。它将通过它拥有的父对象可以绑定到的依赖属性来知道这一点。我的第一个想法是通过UC的最外侧网格来做这件事。所以像这样:

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:valueConverters="clr-namespace:Some.Namespace;assembly=Some.Assembly">
    <UserControl.Resources>
        <valueConverters:VisibilityConverter x:Key="VisibilityConverter"/>
    </UserControl.Resources>
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}}"
          Visibility="{Binding ShowMyself, Converter={StaticResource VisibilityConverter}}">>
        .................
        .................
    </Grid>
</UserControl>

这很好。现在,如果我想通过父对象隐藏控件,这很简单,像这样:

<controls:MyUserControl ShowMyself="{Binding ShowUserControl">
    .........
    .........
</controls:MyUserControl>

但我想知道是否有可能这样做,这样控制,实际上,隐藏自己:

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:valueConverters="clr-namespace:Some.Namespace;assembly=Some.Assembly">
    <UserControl.Resources>
        <valueConverters:VisibilityConverter x:Key="VisibilityConverter"/>
    </UserControl.Resources>
    <UserControl.Visibility>
        <Binding Path="ShowMyself" Converter="{StaticResource VisibilityConverter}"/>
    </UserControl.Visibility>
    <Grid>
        .................
        .................
    </Grid>
</UserControl>

我意识到在实践中可能没有什么区别,这可能是纯粹的学术,但它似乎更"合适"。如果我尝试第二种情况,问题就变成绑定在DataContext之外,无法看到属性- DataContext现在是父对象的,这是有意义的,因为UserControl标签本身本质上不包含"肉"。

就是不可能吗?

UserControl可以通过自己的XAML隐藏自己吗?

如果你想在Usercontrol级别绑定UserControl的属性,使用RelativeSource.Self作为绑定源

<UserControl ...>
    <UserControl.Resources>
        <valueConverters:VisibilityConverter x:Key="VisibilityConverter"/>
    </UserControl.Resources>
    <UserControl.Visibility>
        <Binding 
            RelativeSource="{RelativeSource Self}" 
            Path="ShowMyself" 
            Converter="{StaticResource VisibilityConverter}"/>
    </UserControl.Visibility>
    <!-- .... -->
</UserControl>

需要按照的顺序完成,以避免访问本地VisibilityConverter资源

的问题

你只需要一个RelativeSource Binding:

<UserControl x:Class="MyUserControl"
...
    Visibility="{Binding ShowMyself, RelativeSource={RelativeSource 
    AncestorType={x:Type YourPrefix:MyUserControl}}, Converter="{StaticResource 
    VisibilityConverter}">
    ...
</UserControl>