【问题标题】:How to pass property of embedded control for binding path?如何为绑定路径传递嵌入式控件的属性?
【发布时间】:2011-09-06 11:18:34
【问题描述】:

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

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

    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?”)。

【问题讨论】:

  • 您在“输出”窗口中遇到哪些绑定错误? (Debug Databindings)
  • @H.B.,无(与这些控件有关,有一些错误,但对于完全不同的窗口/控件)。
  • 您能否再给我们一些您的 XAML 以显示控件的嵌套?
  • 你从哪里得到这个“未设置值”?在转换器代码内部,还是作为转换器的结果?更好的是,nav_pane 上的“PageIndex”设置在什么时候?
  • @A.R. “设置”是什么意思?它是 Nullable 有时它是 null,有时它具有实际价值,但我应该得到 Nullable 而不是 DependencyProperty (类型,而且它始终是 UnsetValue)。以防万一,我也会发布这个属性。

标签: c# wpf xaml binding properties


【解决方案1】:

您可能没有正确地将 Button 添加为 NavPane 的逻辑子项。基本上,您应该在 NavPane 上为添加到 UpperSlot 集合的每个项目调用 AddLogicalChild。您还应该致电 RemoveLogicalChild 以获取从您的收藏中删除的任何内容。

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

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

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

【讨论】:

  • 谢谢,但这不是 100% 确定的问题。首先它只是一个控件,我应该能够绑定它(也可以从不相关的小部件)。至于测试,我将这个按钮移到了 NavPane 之外,结果相同。
  • @macias - 如果您可以在某处上传完整的示例,调试起来会容易得多,因为肯定有其他事情发生:-)
  • 放弃我最初的评论——我没有等到所有断点都被评估。在我的自定义控件中放置按钮确实有问题。当我将它移动到层次结构中的相同级别时,它起作用了。我不明白,为什么 XAML 不能发挥所有魔力,我会尽快阅读所有内容。
  • 我选择了另一个解决方案——解决这个问题对我来说太过分了,而且它“闻起来”很奇怪,它应该是 XAML 任务,而不是我的。我将在 PageIndex 更改时设置一个接收器,并为 MainControl 添加一个属性,我可以毫无问题地绑定它。代码量(与理论上固定的版本相比)要少得多。非常感谢您的帮助,我找不到它。
猜你喜欢
  • 2014-08-06
  • 2012-11-11
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2012-11-11
  • 2012-05-02
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多