假设在一个 xaml 窗口中,<UserControl x:Name="Test">...
我有一个自定义MyListBoxItem
,只添加了一个依赖UserControlProperty
属性 typeof UserControl
。
我想使用该语法<c:MyListBoxItem UserControl="Test">Information</c:MyListBoxItem>
,但我不确定如何将类型转换器从字符串“Test”或“local:Test”写入该 xaml 页面上的 usercontrol Test。
回答“nit”的评论:
<Window.Resources>
<UserControl x:Key="Test" x:Name="Test"
x:Shared="False">
<Button Height="50"
Width="50" />
</UserControl>
</Window.Resources>
与<c:MyListBoxItem UserControl="{StaticResource Test}">Information</c:MyListBoxItem>
作品。但是,我希望常规 xaml 定义中的 UserControl 并找到其他两种方法:
<c:MyListBoxItem UserControl="{x:Reference Test}">
但是x:Reference
给出了编译时间错误:方法/操作未实现。它仍然运行,顺便说一句,imo 很奇怪。和:
<c:MyListBoxItem UserControl="{Binding ElementName=Test}"
这是一个很好的解决方案。
至于您可以通过以下方式实现的目标:
private void Menu_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in e.RemovedItems)
{
// collapse usercontrol
UserControl uc = (item as MyListBoxItem).UserControl;
if (uc != null) uc.Visibility = Visibility.Collapsed;
}
foreach (var item in e.AddedItems)
{
// uncollapse usercontrol
UserControl uc = (item as MyListBoxItem).UserControl;
if (uc != null) uc.Visibility = Visibility.Visible;
}
}
这是支持这种菜单结构的好方法,xaml 定义也很清楚:
<c:MyListBoxItem UserControl="{Binding ElementName=Information}" IsSelected="True">Information</c:MyListBoxItem>
<c:MyListBoxItem UserControl="{Binding ElementName=Edit}" IsSelected="False">Edit</c:MyListBoxItem>
<Grid>
<UserControl x:Name="Information" Visibility="Visible"><Button Content="Placeholder for usercontrol Information" /></UserControl>
<UserControl x:Name="Edit" Visibility="Collapsed"> <Button Content="Placeholder for usercontrol Edit" /></UserControl>