c# - UserControl 可以通过自己的 XAML 隐藏自己吗

标签 c# .net wpf xaml user-controls

如果我有一个我想充当覆盖层的用户控件,我希望它隐藏自己,可以这么说,当不需要它时。它将通过父对象可以绑定(bind)到的依赖属性知道这一点。我的第一个想法是通过 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>

这很好用。现在,如果我想通过 Parent 对象隐藏控件,使用类似这样的方法就足够简单了:

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

我意识到在实际方面可能几乎没有区别,这可能纯粹是学术性的,但看起来更“合适”。如果我尝试第二种情况,问题就变成了 Binding 在 DataContext 之外并且看不到属性 - DataContext 现在是父对象的,这是有道理的,因为 UserControl 标签本身基本上不包含“肉”。

这是不可能的吗?

最佳答案

如果您想在 Usercontrol 级别绑定(bind)到 UserControl 的属性,请使用 RelativeSource.Self作为绑定(bind)源

<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资源时出现问题

关于c# - UserControl 可以通过自己的 XAML 隐藏自己吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826974/

相关文章:

c# - 以编程方式更改 Windows 中的打印机首选项

c# - IDictionary 和 ConcurrentDictionary 的线程安全注意事项

c# - 我可以使用 `Semaphore.Release` 作为现成的互锁增量吗?

c# - 双击数据网格的问题

C# - 如何覆盖文本框的 "Up arrow"和 "Down arrow"操作?

c# - 访问回发时动态添加的控件

c# - 值不能为空。参数名称: baseUri

c# - 如何将任意数量的图像动态添加到源字符串位于数据库中的 Web 表单?

.net - 在 vb.net 4.0 中对字典的整数值字段求和

WPF 主窗口控件绑定(bind)属性从另一个窗口更改