【问题标题】:Get instance of another element via Xaml Binding (Attached or DependencyProperty)通过 Xaml 绑定(附加或 DependencyProperty)获取另一个元素的实例
【发布时间】:2012-04-13 23:55:30
【问题描述】:

我有一个用例,我想从另一个元素获取对 Xaml 中一个元素的引用。

例如,考虑这个简单的案例。我有一个名为 A 的 UserControl 和一个名为 B 的 UserControl, 并且不知何故我想注册一个附加属性,B可以在其中获得对A的引用。

例如

<MyCustomControl Name="A"/>
<MyCustomControl Name="B" 
                 AttachedPropClass.TheOtherControl="{Binding ElementName=A}"/> 

所以我希望 B.TheOtherControl 等于 A。这在 Xaml 中可能吗?请注意,我不是绑定到 A 的属性,而是我想要整个元素。

任何使用 DependencyProperties、AttachedProperties 或 Behaviors 的解决方案都可以让我在 Xaml 中做到这一点。

编辑:我正在尝试在 WPF 和 Silverlight4 中执行此操作。我已经尝试了上述方法,但它不起作用,附加属性上的属性更改回调永远不会被击中。

【问题讨论】:

  • 嗯,你试过了吗?你写的代码看起来不错……
  • 是的,我应该说,我已经尝试过了,但它不起作用。我还在 MyCustomControl 上尝试了 DependencyProperty,并通过 ElementName 将 B.TheOther 绑定到 A。都没有奏效。我在依赖属性上有一个 PropertyChanged 回调,它永远不会被击中。所以,至少我没有做一些愚蠢的事情,上面的语法是正确的吗?也许还有其他问题。
  • 试过BindsDirectlyToSource?
  • 你能在这里复制你的附加属性吗??
  • 谢谢@ExitMusic - 从来不知道那个属性。那么在这种情况下会有什么例子呢?请记住,如果有帮助,我可以将 TheOtherControl 实现为 MyCustomControl 上的 DependencyProperty 而不是 Attached Prop。

标签: wpf silverlight xaml binding


【解决方案1】:

您可以使用具有设置为控件名称的属性的行为,然后在逻辑树中搜索控件。我有一个类似的事情,我希望一个控件上的某个事件将焦点移动到另一个控件。我通过为 Behaviour 指定控件名称来做到这一点。

<TextBox Name="A"/>
<TextBox Name="B">
    <Interactivity:Interaction.Behaviors>
        <Behaviours1:ProgressNextOnEnterAction NextTextBoxControlName="A" />
    </Interactivity:Interaction.Behaviors>
</TextBox>

【讨论】:

  • 我实际上最终使用了与此类似的方法。我创建了一个附加属性,它接受一个字符串并传入另一个元素的名称,然后通过 VisualTree 遍历找到它。所以可以用 AttachedProps 来完成,而不仅仅是行为。谢谢(你的)信息! :)
【解决方案2】:

好吧,我想我知道发生了什么。

像这样声明你的依赖属性:

private static readonly DependencyProperty TheOtherControlProperty =
                              DependencyProperty.RegisterAttached(
                                      "TheOtherControl",
                                      typeof(MyCustomControl),
                                      typeof(AttachedPropClass),// Change this part
                                      null);

    public static MyCustomControlGetTheOtherControl(MyCustomControltarget)
    {
        return (MyCustomControl)target.GetValue(TheOtherControlProperty);
    }
    public static void SetTheOtherControl(MyCustomControltarget, TextBlock value)
    {
        target.SetValue(TheOtherControlProperty, value);
    }

我认为问题在于您将依赖属性的OwnerType 设置为MyCustomControl 而不是AttachedPropClass

我创建了一个有效的示例。

试一试,如果我是对的,请告诉我。

u_u

【讨论】:

  • 感谢您的示例,非常感谢。让我试试这个然后回复你:)
  • 更新,这几乎就是我所拥有的,除了附加属性是在 MyCustomControl 中声明的(所以两种类型都是相同的)。不幸的是,无论我做什么,我都无法让它发挥作用。无论如何感谢您的帮助!
  • 奇怪...我看看能不能重现
  • 那么"{Binding ElementName=A}" 有效吗?从来不知道!
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多