-1

我觉得我有很多具有这两个属性的模型视图模型

public Visibility OkButtonVisibility
{
get{  return _OkButtonVisibility;}
set{ 
_OkButtonVisibility = value;
RaisePropertyChanged("OkButtonVisibility");
}

}

public Visibility CancelButtonVisibility
{
get{  return _CancelButtonVisibility;}
set{ 
_CancelButtonVisibility = value;
RaisePropertyChanged("CancelButtonVisibility");
}

}

我想为它们创建可附加的界面,如下所示:

Interface IOKandCancelButtonsVM
{
 public Visibility OkButtonVisibility
{
get{  return _OkButtonVisibility;}
set{ 
_OkButtonVisibility = value;
RaisePropertyChanged("OkButtonVisibility");
}

}

public Visibility CancelButtonVisibility
{
get{  return _CancelButtonVisibility;}
set{ 
_CancelButtonVisibility = value;
RaisePropertyChanged("CancelButtonVisibility");
}

}

并让我的视图模型使用它来继承它们以及具有像这样的代理属性的另一个接口

class VM1:BaseVM,IOKandCancelButtonsVM,IOtherCommonPropertyVM
{ 

} 

但后来我发布了我的新界面并没有暗示INotifyChangedIOKandCancelButtonsVM隐含INotifyChangedVM1明确隐含会是一个坏主意BaseVM吗?

我从来没有处理过两次继承相同接口的类并且不知道该怎么做。

这只是一个示例,只有不到一半的 VM 使用我拥有数百个属性的那些,其中许多在数十个屏幕上共享。我需要一个更优雅的解决方案,而不是把所有东西都粘在 BaseViewModel 中

4

4 回答 4

2

您的接口定义中不能有实现。这意味着您的IOKandCancelButtonsVM定义不正确。

让 IOKandCancelButtonsVM 实现 BaseVM 会是个坏主意吗

是的,这将是一个非常糟糕的主意——事实上不可能——接口不能实现或扩展类。

既然您就如何构建代码征求意见,我也会把它扔在那里:从您的视图模型中删除对“可见性”的任何引用。不要从您的视图模型返回 System.Visibility 值。

视图模型不应该对视图一无所知。语义上正确的方法是简单地从视图模型返回一个标志,并使用转换器将其更改为绑定中的可见性值 - 框架中甚至有一个现成的转换器来执行此操作:BooleanToVisibilityConverter。尽量避免在您的 VM 中提及任何与 UI 相关的术语,即使它返回一个布尔值 - 这是一种很好的做法,它会导致代码更紧凑、更规范,随意使用这些名称最终会导致代码有问题。

我有一篇博文说明了一种很好的属性更改通知方法:Streamlining property notifications in MVVM

为了清楚起见,我建议您摆脱对IOKandCancelButtonsVM接口的任何想法,无论如何都要在基本视图模型上包含简单的布尔属性,该属性将由许多其他视图模型扩展,这些视图模型将绑定到带有确定/取消的对话框纽扣。

要在文本中绘制它,它看起来像这样:

YourBaseVm <-- BaseVmUsedByDialogs <-- SpecificDialogVm

(注意斜体表示该类是抽象的)

于 2012-07-01T07:56:53.337 回答
1

看来您已经有了一个基本的 viewmodel 类。只需在此处添加两个属性。您可能希望创建从第一个继承的第二个基,当需要这两个属性时使用它,因此如果它们不是,则没有开销。

于 2012-07-01T07:29:50.453 回答
1

为什么不在virtual properties你的基类 BaseVM 中实现默认功能呢?如果其他派生类想要扩展它,他们总是可以根据所需的功能覆盖它。

确保您的 BaseVM 正在实施INotifyPropertyChanged.

于 2012-07-01T08:04:35.813 回答
0

我只需创建一个抽象基类,并让需要这些属性的 ViewModel 继承自它。把事情简单化。

abstract class BaseDialogVM : BaseVM
{
    private Visibility _OkButtonVisibility;
    public Visibility OkButtonVisibility {
        get { return _OkButtonVisibility; }
        set { 
           _OkButtonVisibility = value;
           RaisePropertyChanged("OkButtonVisibility");
        }
    }

    private Visibility _CancelButtonVisibility;
    public Visibility CancelButtonVisibility {
        get { return _CancelButtonVisibility; }
        set { 
           _CancelButtonVisibility = value;
           RaisePropertyChanged("CancelButtonVisibility");
        }
    }
}

class VM1 : BaseDialogVM { /*...*/ }
于 2012-07-02T05:26:59.620 回答