在不违反MVVM的情况下将内部UserControl转换为第三方控件

时间:2016-09-05 15:47:26

标签: c# wpf mvvm

我有ChildUserControl这样的视图模型:

public class ChildViewModel
{
    public ChildViewModel(HugeSettings settings)
    {
        // process settings
    }

    public int SelectedItemsCount { get; internal set; }

    // ... and many other properties which should be read-only from outside.
}

当所有控件都在单个项目中时,ParentUserControl将使用ChildUserControl,如下所示:

<ParentUserControl ... >
    <ChildUserControl DataContext="{Binding ChildViewModel}" />
</ParentUserControl>

视图模型:

public class ParentViewModel
{
    public ParentViewModel()
    {
        this.ChildViewModel = new ChildViewModel(new HugeSettings());
    }

    // INotifyPropertyChanged implementation omitted
    public ChildViewModel ChildViewModel { get; set; }
}

在这种情况下,我可以使用构造函数初始化ChildViewModel,我可以直接在ChildViewModel内获取任何ParentViewModel属性,而无需担心是否存在任何视图或用户控件。

问题需要将ChildUserControl放入单独的库以便与其他应用程序共享(他们将使用ChildUserControl作为第三个 - 党控制)。在这种情况下,外国程序不应直接操作ChildViewModel,因为第三方用户控件通常应该像这样使用:

<ForeignUserControl ... >
    <ChildUserControl HugeSettings="{Binding Setting}" SelectedItemsCount="{Binding Count, Mode=OneWayToSource}" />
</ForeignUserControl>

除了SelectedItemsCount之外我有许多只读属性,似乎我只有一个选择:在UserControlChild的代码隐藏中创建依赖项属性并将它们与相应的视图模型的属性连接起来。

这种做法是否正确?是否存在更好的方法?

更新

谷歌搜索“mvvm第三方用户控件”给了我this question 非常类似的问题。提问者决定在代码隐藏中使用依赖属性 所以我有一个选择:
1.在代码隐藏中为视图模型中的每个所需属性创建DP并链接每对。 (违反MVVM?)
2.只需将所有视图模型逻辑移动到代码隐藏并将属性转换为DP。肯定违反了MVVM,但有opinion“MVVM 是一个不错的选择,如果你正在开发一个将被其他人使用的UserControl”。

我更喜欢什么?还有其他选择吗?

0 个答案:

没有答案