【问题标题】:MvvmCross binding ObservableCollection<MyItem> to ObservableCollection<object>MvvmCross 绑定 ObservableCollection<MyItem> 到 ObservableCollection<object>
【发布时间】:2015-02-16 13:20:50
【问题描述】:

我做了一个自定义视图(MyCustomView),可以在android layout xml中使用。当您单击它时,它会打开一个包含列表的对话框 (MyDialog)。

MainPageLayout -> MyCustomView -> click -> MyDialog

MyDialog 继承自 MvxDialogFragment:

public class MyDialog : MvxDialogFragment
{
    public event EventHandler ItemSourceChanged;

    public ObservableCollection<MyItem> ItemsSource
    {
        get
        {
            return itemsSource;
        }

        set
        {
            itemsSource = value;
            if (ItemSourceChanged != null)
            {
                ItemSourceChanged.Invoke(this, new EventArgs());
            }
        }
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var ignored = base.OnCreateView(inflater, container, savedInstanceState);
        var view = this.BindingInflate(Resource.Layout.my_layout, container, false);
        var listview = view.FindViewById<MvxListView>(Resource.Id.my_listview);
        listview.ItemsSource = ItemsSource;
        return view;
    }
}

视图模型:

public class MyViewModel : MvxViewModel
{
    public ObservableCollection<MyItem> MyCollection
    {
        get { return myCollection; }
        private set { SetProperty(ref myCollection, value); }
    }
}

到目前为止,一切都很好 - 这可以按预期工作。在视图中创建绑定集,并显示 VM 的“MyCollection”列表。

但是,我非常希望将 MyDialog 与其他不同的集合一起使用,而不仅仅是 ObservableCollection&lt;MyItem&gt;。为此,我将 MyDialog 中的 ItemsSource 更改为 ObservableCollection&lt;object&gt;,但这会导致其设置器不再被调用(由绑定集),因此列表视图的 itemSource 设置为 null。

如何使 MyDialog 更通用?

【问题讨论】:

  • 怀疑您可能在某处打错了字?不确定To achieve this, i change the ItemsSource in MyDialog to be a ObservableCollection 是否有意义?
  • 啊,是的,泛型类型被切断了。我已经改变了格式。我将集合从包含“MyItem”的元素更改为“object”的元素。希望它现在更有意义。

标签: c# android mvvm xamarin mvvmcross


【解决方案1】:

public class MyDialog&lt;T&gt; 会使其通用。

示例:www.dotnetperls.com/generic

【讨论】:

  • 我不能让它通用,因为我需要从 XML 实例化它
  • 你可以从BaseDialog&lt;T&gt;继承
  • 我可以,但是我会为对话框可能使用的每种类型提供一个具体的实现。出现问题是因为更改 ViewModel 是我希望在这个项目中避免的事情——我不能只让 MyItem 从 IListItem 或类似的东西继承。也许我可以使用 valueconverter 将 Collection 绑定到 Collection
【解决方案2】:

您是否尝试过使用动态?

public ObservableCollection<dynamic> ItemsSource

我使用动态对象将对象和集合从一个视图模型传递到下一个视图模型

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多