WinRT中的DependencyProperty与IEnumerable的不点火都(WinRT D

2019-06-24 08:22发布

我已经冲刷和冲刷,因为我知道,已经张贴了关于依赖属性了很多,但我还没有完全看到任何在那里,有一个可行的解决方案。 我想从我的ViewModel一个ObservableCollection绑定到我的AutoCompleteBox。 我的视图模型的返回数据,吸气剂被击中。 然而,在此之后,控制的或的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"/>

作为测试并且为简化起见,我创建了一个字符串的DependencyProperty为SEARCHTEXT。 如果我绑定SEARCHTEXT它工作正常,在OnSearchTextPropertyChanged被称为:

<toolkit:AutoCompleteBox Grid.Row="5" Grid.Column="2" ItemsSource="{Binding Persons,Mode=TwoWay}" SearchText="{Binding SearchText}"/>

其他人遇到这些问题与WinRT的? 或者看到什么毛病我在做什么?

Answer 1:

我会尝试检查,如果结合以往任何时候都具有DebugConverter火灾-检查BindingDebugConverter在WinRT的XAML工具包 -它设置为一个转换器为您的结合,看看当它打破(是在转换或ConvertBack,正在建立什么样的价值等等。)。

如果不帮助 - 检查你的DataContext设置正确。

*编辑1

如果你在找什么是绑定的集合的项目变化-你可以检查的ItemsSource是INotifyCollectionChanged ,如果真-订阅CollectionChanged事件看到的变化。 否则-你可以修改你的控制,从继承的ItemsControl和覆盖诸如方法GetContainerForItemOverride和IsItemItsOwnContainerOverride 。

* EDIT 2

好像有一个错误在与使用的IEnumerable作为一个依赖属性的类型,在Windows 8消费者预览版的框架。 使用对象的类型解决了这个问题。 如果启用本地代码调试,你会看到这种结合例外:

错误:转换器无法转换类型System.Collections.ObjectModel.ObservableCollection`1的”价值[ACBDP.Person,ACBDP,版本= 1.0.0.0,文化=中立,公钥=空],系统,版本= 4.0.0.0文化=中性公钥= b77a5c561934e089' 为类型‘的IEnumerable’; BindingExpression:路径= '人' 的DataItem = 'ACBDP.BlankPageViewModel,ACBDP,版本= 1.0.0.0,文化=中立,公钥=空'; 目标元素是“ACBDP.AutoCompleteBox”(名称=“空”); 目标属性是 '的ItemsSource'(类型 'IEnumerable的')。



Answer 2:

有2个快速解决方案

(这里的BaseClass是例如,你从和实例派生抽象类或一个接口,其中你正在试图绑定到一个依赖属性)

解决方案1:

您需要更改typeof(BaseClass)typeof(object)注册依赖属性时。 getter和setter可以继续使用您的BaseClass的 ,但要注意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

这里DerivedClass1BaseClass的衍生。

为什么?

我想,其原因是XAML不知道你的派生类型任何东西,只知道对BaseClass的 。 因此,创建每种类型应该解决的问题一个虚拟依赖属性。



Answer 3:

变化的typeof(IEnumerable的)来的typeof(对象)



文章来源: WinRT DependencyProperty with IEnumerable not firing at all