如何将嵌入式控件的属性传递给绑定路径?

时间:2011-06-01 16:33:41

标签: c# wpf xaml binding properties

我有嵌套(自定义)控件的自定义控件。我想从嵌套控件获取属性并将其传递给主控件的转换器。这是我的代码:

<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的依赖属性。

我错过了什么?

编辑

1

更长的例子。 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>
                     ...

其余的都在上面。

2

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上找到的一个很好的类,它获取属性,字段等的名称。多亏了它,我避免了神奇的数字,我更适合混淆。

3

我在转换器中将UnsetValue作为输入参数。 PageIndex在不同的场合设置(它也取决于用户)。但是要集中注意力,我将它(现在)设置为null作为构造函数中的第一行。所以理论上我应该得到这样的参数 - null(如“int?”)。

1 个答案:

答案 0 :(得分:1)

您可能无法正确添加Button作为NavPane的逻辑子项。基本上,您应该在NavPane上为添加到UpperSlot集合中的每个项目调用AddLogicalChild。您还应该致电RemoveLogicalChild了解从您的收藏中移除的任何内容。

最后,您需要在NavPane中覆盖LogicalChildren并在集合中包含项目(除了基本版本返回的任何内容)。

如果UpperSlot不是集合,那么您只需要添加/删除它引用的单个元素。

Kent Boogaart对此here有一个很好的写作。有关ElementName解析的更多信息可以在herehere找到。

相关问题