【问题标题】:How to write a custom dependecy property and data bind to custom type?如何编写自定义依赖属性和数据绑定到自定义类型?
【发布时间】:2013-08-01 06:53:52
【问题描述】:

我在 winrt 环境中有一个项目,我试图通过扩展标准 GridView 控件的功能来扩展它。目标是改变 GridView 的 SelectedItems 行为。

public class myGridView : GridView
{

    /// <summary>
    ///  My replacement of SelectedItems
    /// </summary>
    public IObservableVector<object> appItems
    {
        get { return GetValue(AppSelectedItemsProperty) as IObservableVector<object>; }
        set { SetValue(AppSelectedItemsProperty, value);
        appItems.VectorChanged += AppSelectedItemsChanged;
        }
    }

    /// <summary>
    /// Identifies the AppSelectedItems dependency property.
    /// </summary>
    public static readonly DependencyProperty AppSelectedItemsProperty =
            DependencyProperty.Register(
            "appItems",
            typeof(IObservableVector<object>),
            typeof(AppGridView),
            new PropertyMetadata(null, AppItemsPropertyCallback));

    ….
    ….
    ...
   }

在我的 XAML 文件中,我有以下内容..

<xx
   …….
   <appControls:AppGridView  appItems="{Binding ContactsListSelectedItems, Mode=TwoWay } }">
       .…
        …
   </appControls:AppGridView >
   …..
   …….

 /xx>

最后一段代码是绑定到 Datacontext 的 MVVM 类。

 public  class myModel: baseModel
 {
   ……
   ……..
   /// <summary>
    /// Not Working
    /// </summary>
    private  IObservableVector<Contact> _ContactsListSelectedItems;
    public IObservableVector<Contact> ContactsListSelectedItems
    {
        get
        {
            return (IObservableVector<Contact>)_ContactsListSelectedItems;
        }
        set
        {
            SetProperty<IObservableVector<Contact>>(ref _ContactsListSelectedItems, value);              
        }
    }

 ….
 ….
}  

我在这里找到了 IObservableVector 的实现:https://gist.github.com/runceel/2437074

与 ContactsListSelectedItems 的数据绑定不起作用,出现以下错误:

Error: Cannot get 'ContactsListSelectedItems' value (type 'Object') from type 'Consius.ActiveWork.Pages.ContactPage.ContactPageViewModel, Consius.ActiveWork, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. BindingExpression: Path='ContactsListSelectedItems' DataItem='Consius.ActiveWork.Pages.ContactPage.ContactPageViewModel, Consius.ActiveWork, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'; target element is 'Consius.ActiveWork.Controls.AppGridView' (Name='ContactsList'); target property is 'appItems' (type 'IObservableVector`1<Object>').

如果我将 ContactsListSelectedItems 的类型更改为:

IObservableVector<object>

一切正常。

这对我来说不是一个可接受的解决方案,使用类对象编写我的 MVVM 类。

有没有人可以给我提示什么是错的?

【问题讨论】:

    标签: c# winrt-xaml dependency-properties


    【解决方案1】:

    您是否尝试过使用 ObservableCollection 而不是 IObservableVector 以及您找到的自定义实现?

    【讨论】:

    • 没有。我读过 IObservableCollection 将被 IObservableVector 取代,所以我从未尝试过。你认为 ObservableVector 的实现可能有问题??
    • 现在我写了一个使用 ObservableCollection 而不是 Observable 向量的版本。我仍然有一个错误:“转换器无法将 ObservableCollection 类型的值转换为 ObservableCollection
    【解决方案2】:

    我目前正在研究同样的问题。似乎有两个问题。 一,如果你将你的类型(联系人)移动到一个WinRT Component项目,它摆脱了类型不能被实例化的异常,因为它不是一个合法的WinRT类型,但是还有第二个问题,当类型不是对象,使用枚举器而不是虚拟化和索引器。到目前为止,除了使用对象之外,我看不到解决问题的方法......

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2013-06-20
      • 2011-12-20
      • 2012-12-07
      • 2012-08-29
      相关资源
      最近更新 更多