2011-06-01 53 views
2

我有嵌套(自定义)控件的自定义控件。我想从嵌套控件获取属性并将其传递给主控制器的转换器。这里是我的代码:如何通过绑定路径嵌入控件的属性?

<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中的房产属性。

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

您在输出窗口中遇到什么绑定错误? ([Debug Databindings](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx)) – 2011-06-01 16:46:14

+0

@HB,没有(与这些控件相关,有一些错误,但对于完全不同的窗口/控件)。 – greenoldman 2011-06-01 17:08:00

+0

你能给我们多一点你的XAML显示控件的嵌套? – Tim 2011-06-01 17:39:07

回答

1

可能是您没有正确添加按钮作为NavPane的逻辑子项。基本上,您应该在您的NavPane上为每个添加到UpperSlot集合的物品调用AddLogicalChild。您还应该拨打RemoveLogicalChild以取消您收藏中的任何内容。

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

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

肯特Boogaart有这个here好写。有关ElementName分辨率的更多信息,请参见herehere

+0

谢谢,但这不是100%确定的问题。首先,它只是一个控件,我应该能够绑定它(从无关的小部件也是如此)。至于测试,我将这个按钮移到NavPane之外,结果相同。 – greenoldman 2011-06-01 19:38:20

+0

@macias - 如果你可以在某个地方上传一个完整的样本,调试将变得更加容易,因为一定还有其他事情正在进行:-) – CodeNaked 2011-06-01 19:39:56

+0

报废我的初始评论 - 我没有等待所有断点评估。将按钮放置在我的自定义控件中确实是错误的。当我将它移动到层次结构中的同一层时,它就起作用了。我不明白,为什么XAML不会做所有的魔术,我会尽快阅读所有的东西。 – greenoldman 2011-06-02 17:54:37

相关问题