gpt4 book ai didi

dependency-properties - 带有 IEnumerable 的 WinRT DependencyProperty 根本不会触发

转载 作者:行者123 更新时间:2023-12-04 18:12:34 26 4
gpt4 key购买 nike

因为我知道已经发布了很多关于依赖属性的帖子,所以我一直在搜索和搜索,但我只是还没有看到任何有有效解决方案的东西。我正在尝试将我的 ViewModel 中的 ObservableCollection 绑定(bind)到我的 AutoCompleteBox。我的 ViewModel 正在返回数据,Getter 被击中。但是,在那之后,控件的 SetValue 或 OnItemsSourcePropertyChanged 不会触发。有什么想法可能是错的吗?

我有这样的控制:

[ContentProperty(Name = "ItemsSource")]
public partial class AutoCompleteBox : Control
{
//local stuff
private ListBox lb;
private List<Person> _items;
private ObservableCollection<Person> _view;

public AutoCompleteBox() : base()
{
DefaultStyleKey = typeof(AutoCompleteBox);
Loaded += (sender, e) => ApplyTemplate();
}
protected override void OnApplyTemplate()
{
this.lb = this.GetTemplateChild("Selector") as ListBox;
base.OnApplyTemplate();

}
#region ItemsSource

public IEnumerable ItemsSource
{
get { return GetValue(ItemsSourceProperty) as ObservableCollection<Person>; }
set { SetValue(ItemsSourceProperty, value); } //Never gets called
}

public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register(
"ItemsSource",
typeof(IEnumerable),
typeof(AutoCompleteBox),
new PropertyMetadata(null, OnItemsSourcePropertyChanged));

private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//Never gets called :(
}
#endregion

public String SearchText
{
get { return GetValue(SearchTextProperty) as String; }
set
{
SetValue(SearchTextProperty, value);
}
}


public static readonly DependencyProperty SearchTextProperty =
DependencyProperty.Register(
"SearchText",
typeof(String),
typeof(AutoCompleteBox),
new PropertyMetadata(null, OnSearchTextPropertyChanged));

private static void OnSearchTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
//gets fired when loaded, with data being bound
}

}

以下是它是如何使用控件的:
<toolkit:AutoCompleteBox Grid.Row="5" Grid.Column="2" ItemsSource="{Binding Persons,Mode=TwoWay}" SearchText="WhatTheHell"/>

作为测试和简单起见,我为 SearchText 创建了一个 String DependencyProperty。如果我绑定(bind) SearchText,它工作正常,调用 OnSearchTextPropertyChanged:
<toolkit:AutoCompleteBox Grid.Row="5" Grid.Column="2" ItemsSource="{Binding Persons,Mode=TwoWay}" SearchText="{Binding SearchText}"/>

还有其他人在使用 WinRT 时遇到过这些问题吗?或者看到我在做什么有什么问题?

最佳答案

有2个快速解决方案

(这里的 BaseClass 是您从中派生的抽象类或接口(interface)以及您尝试绑定(bind)到依赖属性的实例)

解决方案1:

您需要更改 typeof(BaseClass)typeof(object)注册依赖属性时。
Getter 和 setter 可以继续使用您的 基类 ,但如果您为此依赖属性设置了不同的类型实例,请注意 InvalidCastException。

        public BaseClass Item
{
get { return (BaseClass)GetValue(ItemProperty); }
set { SetValue(ItemProperty, value); }
}
public static readonly DependencyProperty ItemProperty =
DependencyProperty.Register("Item", typeof(object), typeof(MyUserControl), new PropertyMetadata(null));

解决方案2:

在代码中的某处创建一个虚拟依赖属性(例如,在您尝试创建的依赖属性之后),该属性将具有所有派生类型的类型。
像这样:
#region DummyProperty

public DerivedClass1 Dummy
{
get { return (DerivedClass1)GetValue(DummyProperty); }
set { SetValue(DummyProperty, value); }
}

public static readonly DependencyProperty DummyProperty =
DependencyProperty.Register("Dummy", typeof(DerivedClass1), typeof(MyUserControl), new PropertyMetadata(default(DerivedClass1)));

#endregion

这里 派生类1 源自 基类 .

为什么?

我想原因是 XAML 对您的派生类型一无所知,只知道 基类 .因此,为每种类型创建一个虚拟依赖属性应该可以解决问题。

关于dependency-properties - 带有 IEnumerable 的 WinRT DependencyProperty 根本不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com