具有自定义附加属性的 SortDescription

发布于 2024-09-05 12:34:58 字数 347 浏览 6 评论 0原文

在 Xaml 中,我可以使用设置自定义附加属性 local:TestClass.TestProperty="1"

我可以使用绑定到自定义附加属性 {绑定路径=(命名空间:[OwnerType].[PropertyName])} {Binding Path=(local:TestClass.TestProperty)}

但是,当我需要在 SortDescription 中使用自定义附加属性时,如何指定命名空间? 我可以使用绑定到附加属性 new SortDescription("(Grid.Row)", ListSortDirection.Descending) 但在这里我无法在任何地方设置命名空间...

最好的问候, 杰斯珀

In Xaml I can set a custom attached property using
local:TestClass.TestProperty="1"

An I can bind to a custom attached property using
{Binding Path=(Namespace:[OwnerType].[PropertyName])}
{Binding Path=(local:TestClass.TestProperty)}

But how do I specify the namespace when I need to use a custom attached property in a SortDescription?
I can bind to an attached property using
new SortDescription("(Grid.Row)", ListSortDirection.Descending)
but here I can't set a namespace anywhere...

Best Regards,
Jesper

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

春庭雪 2024-09-12 12:34:58

不能,原因与 {Binding Path=a:bc} 有效但 {Binding a:bc} 无效的原因相同:PropertyPath 构造函数没有命名空间语境。

不幸的是,对于 SortDescription 来说,您无能为力。您必须找到一种不使用附加属性的排序方法。

通常我告诉人们,使用 Tag 是错误编码的一个指标,但在这种情况下,Tag 可能是您的最佳选择:您可以在 Tag 中创建一个对象,该对象具有返回您想要的实际附加属性的属性。

在 PropertyChangedCallback 中,将 Tag 实例化为内部类的实例:

public class TestClass : DependencyObject
{
  ... TestProperty declaration ...
  PropertyChangedCallback = (obj, e) =>
  {
    ...
    if(obj.Tag==null) obj.Tag = new PropertyProxy { Container = obj };
  });

  public class PropertyProxy
  {
    DependencyObject Container;
    public SomeType TestProperty { get { return GetTestProperty(Container); } }
  }
}

现在您可以在 SortDescription 中使用 Tag 的子属性:

<SortDescription PropertyName="Tag.TestProperty" />

如果只有一个属性要排序,则只需使用 Tag 即可。

这样做的主要问题是使用 Tag 属性将与也尝试使用该 Tag 的任何其他代码发生冲突。因此,您可能想在标准库中查找一些晦涩的 DependencyProperty,这些属性甚至不适用于有问题的对象,并使用它来代替 Tag。

You can't, for the same reason that {Binding Path=a:b.c} works but {Binding a:b.c} doesn't: The PropertyPath constructor has no namespace context.

Unfortunately in the case of SortDescription there isn't much you can do about it. You have to find a way to sort without using attached properties.

Normally I tell people that use of Tag is an indicator of bad coding, but in this case Tag may be your best option: You can create an object within Tag that has properties that return the actual attached properties you want.

In your PropertyChangedCallback, instantiate Tag to an instance of an inner class:

public class TestClass : DependencyObject
{
  ... TestProperty declaration ...
  PropertyChangedCallback = (obj, e) =>
  {
    ...
    if(obj.Tag==null) obj.Tag = new PropertyProxy { Container = obj };
  });

  public class PropertyProxy
  {
    DependencyObject Container;
    public SomeType TestProperty { get { return GetTestProperty(Container); } }
  }
}

Now you can use the sub-property of Tag in your SortDescription:

<SortDescription PropertyName="Tag.TestProperty" />

If there is only a single property to be sorted, you can simply use the Tag for it.

The main problem with this is that using the Tag property will conflict with any other code that also tries to use the Tag. So you may want to look for some obscure DependencyProperty in the standard libraries that doesn't even apply to the objects in question and use that instead of Tag.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文