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
级别绑定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>