gpt4 book ai didi

wpf - 避免在 MVVM 中使用更胖的 View 模型

转载 作者:行者123 更新时间:2023-12-01 03:51:22 25 4
gpt4 key购买 nike

我正在开发一个遵循 MVVM 模式的 WPF 应用程序。尽管将验证转移到服务中,但我最终得到了一个运行多行代码的胖 View 模型(在我的例子中接近 1000 行)。
我在这里添加了 View 模型的接口(interface)。我得到了一些作为组合公开的集合,并且基于组合选择,我必须执行验证/调用服务/将过滤应用于其他组合

public interface ISampleViewModel         {
ObservableCollection<InstrumentDto> Collection1 { get; set; }
ObservableCollection<TenderViewConfigDetailViewModel> Collection2 { get; set; }
ObservableCollection<TenderViewConfigDetailViewModel> Collection3 { get; set; }
ObservableCollection<TenderViewConfigDetailViewModel> Collection4 { get; set; }
ObservableCollection<TenderViewConfigDetailViewModel> Collection5 { get; set; }
TenderViewConfigDetailViewModel SelectedViewConfigDetail { get; set; }
int SelectedTenderViewIndex { get; set; }
int SelectedInstrumentsViewIndex { get; set; }
SortableCollection<TenderViewToInstrumentViewModel> CurrentInstruments { get; set; }
TenderViewToInstrumentViewModel SelectedInstrumentForTenderView { get; set; }
InstrumentDto SelectedInstrument { get; set; }
bool IsAllInstrumentsFocused { get; set; }
ICommand ApplyChangesCommand { get; }
ICommand AddTenderPanelViewCommand { get; }
ICommand DeleteTenderPanelViewCommand { get; }
ICommand ModifyTenderViewVisiblityCommand { get; }
ICommand AddInstrumentsToPanelViewCommand { get; }
ICommand DeleteInstrumentsFromPanelViewCommand { get; }
ICommand MoveUpTenderListViewCommand { get; }
ICommand MoveDownTenderListViewCommand { get; }
ICommand MoveUpInstrumentsCommand { get; }
ICommand MoveDownInstrumentsCommand { get; }
bool IsValidModel { get; }
void PublishTenderViewConfigChanges(TenderViewConfigDetailViewModel viewModel,EventActionType actionType);
}

上面的一组功能使我的 View 模型更加庞大。我怎样才能避免它?我想不出将功能分解成更小的控件,因为它们是依赖的?我在这里错过了什么吗?

最佳答案

如果您已存储在 ViewModel可以在单独的类中隔离的属性,最好将它们移动到单独的 Model .大量属性漂亮加载ViewModel ,对于每种类型的属性,您应该创建您的 Model .虽然在这个场合有一些争论,但我相信如果在 ViewModel 中没有错。将链接到几个 Models .在这个主题上,您可以看到以下答案:

In MVVM, is every ViewModel coupled to just one Model?

使用单独模型的示例:

Model

public class MainMenuModel : NotificationObject // Here also implemented INotifyPropertyChanged interface
{
private bool _buttonIsEnabled = true;

public bool ButtonIsEnabled
{
get
{
return _buttonIsEnabled;
}

set
{
_buttonIsEnabled = value;
NotifyPropertyChanged("ButtonIsEnabled");
}
}
}

ViewModel
public class MainMenuViewModel
{
private MainMenuModel _mainMenuModel = null;

public MainMenuModel MainMenuModel
{
get
{
return _mainMenuModel;
}

set
{
_mainMenuModel = value;
}
}

...

public MainMenuViewModel()
{
MainMenuModel = new MainMenuModel();
}
}

View
<Button IsEnabled="{Binding Path=MainMenuModel.ButtonIsEnabled}" ... />

唯一可以留在 ViewModel旁边的东西, 它命令和 IDataErrorInfo接口(interface)实现,尽管 IDataErrorInfo 的实现也可以移到 Model旁边.

此外,如果 Command 的实现占用大量空间,您可以创建单独的函数/过程,可以这样调用 Helper并安排在合适的类(class)。接下来,在Command中没有写完整的实现,有必要引用这个方法。

例如:
private ICommand _findCommand = null;

public ICommand FindCommand
{
get
{
if (_findCommand == null)
{
_findCommand = new RelayCommand(param => this.Find(), null);
}

return _findCommand;
}
}

private void Find()
{
// Here instead of writing large code,
// moving find logic to separate static class

SomeHelper.FindPerson(MainModel.SearchName);
}

因此,在这种情况下,Command 是 ViewModel 中调用方法的包装器。 .

关于wpf - 避免在 MVVM 中使用更胖的 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22451288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com