我有嵌套(自定义)控件的自定义控件。我想从嵌套控件获取属性并将其传递给主控件的转换器。这是我的代码:
<Button.IsEnabled>
<MultiBinding Converter="{x:Static app:MainControl.CanExcludeConverter}">
<Binding Path="PageIndex" ElementName="nav_pane"/>
<Binding Path="History" />
</MultiBinding>
</Button.IsEnabled>
第二个参数是正确传递的,但第一个参数不是 - 不管我做什么,我只得到DependencyProperty.UnsetValue。首先我将PageIndex作为带有通知符的属性,然后我将其作为依赖属性,然后我尝试了几种方法来设置绑定 - 完全没有成功。
“nav_pane”是我的自定义控件的名称,它嵌套在MainControl中。 PageIndex是NavPane的依赖属性。
我错过了什么?
更长的例子。 MainControl实际上由NavPane组成,并且全部:-)由于在NavPane中设置的依赖属性为“插槽”,我可以在NavPane的框架(矩形)中添加新控件。所以这就是它的开始:
<UserControl x:Class="Worture.MainControl"
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:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:app="clr-namespace:Worture"
mc:Ignorable="d"
Height="Auto" Width="320"
BorderThickness="2" BorderBrush="Navy"
MouseEnter="UserControl_MouseEnter"
IsVisibleChanged="UserControl_IsVisibleChanged"
Loaded="UserControl_Loaded">
<Grid Margin="4,0,4,4">
<app:NavPane x:Name="nav_pane"
OnNavigation="UpdateNavPane">
<app:NavPane.UpperSlot>
<Button Margin="4,0,0,0">
<StackPanel Orientation="Horizontal">
<app:AutoGreyableImage Source="/Worture;component/Images/plus.png" Width="24" Height="24"/>
</StackPanel>
<Button.IsEnabled>
...
其余的都在上面。
NavPane中的Dependy属性。
public static readonly DependencyProperty PageIndexProperty =
DependencyProperty.Register(NameOf.Get((NavPane dlg) => dlg.PageIndex),
typeof(int?),
typeof(NavPane),
new UIPropertyMetadata(null));
public int? PageIndex
{
get { return (int?)GetValue(PageIndexProperty); }
set { SetValue(PageIndexProperty, value); }
}
NameOf是在SO上找到的一个很好的类,它获取属性,字段等的名称。多亏了它,我避免了神奇的数字,我更适合混淆。
我在转换器中将UnsetValue作为输入参数。 PageIndex在不同的场合设置(它也取决于用户)。但是要集中注意力,我将它(现在)设置为null作为构造函数中的第一行。所以理论上我应该得到这样的参数 - null(如“int?”)。
答案 0 :(得分:1)
您可能无法正确添加Button作为NavPane的逻辑子项。基本上,您应该在NavPane上为添加到UpperSlot集合中的每个项目调用AddLogicalChild。您还应该致电RemoveLogicalChild了解从您的收藏中移除的任何内容。
最后,您需要在NavPane中覆盖LogicalChildren并在集合中包含项目(除了基本版本返回的任何内容)。
如果UpperSlot不是集合,那么您只需要添加/删除它引用的单个元素。
Kent Boogaart对此here有一个很好的写作。有关ElementName解析的更多信息可以在here和here找到。