0

对于 WPF MVVM 中视图的代码隐藏文件,我不清楚应该遵循哪些约定。

在我的特定场景中,我想知道将代码放在后面的代码中是否被认为是一种好习惯,链接到我视图上按钮的单击事件,以从硬盘驱动器中定位图像并将其加载到图像控件中在视图上。代码看起来像这样:

var ofd = new OpenFileDialog { Filter = "Bitmap Files(*.bmp)|*.bmp" };

ofd.ShowDialog();

if (ofd.FileName != null)
{
    var image = BitmapFactory.ConvertToPbgra32Format(new WriteableBitmap(new BitmapImage(new Uri(ofd.FileName, UriKind.Absolute))));

    MyImageControl.Width = image.Width;
    MyImageControl.Height = image.Height;

    MyImageControl.Source = image;
}

对于视图的代码隐藏来说,这是否太多逻辑?如果是这样,我应该将它放在 ViewModel 中还是放在不同的类中并从 View 中调用该方法?

此外,在更广泛的范围内,如果有人可以提供一些明确的指导方针的链接,关于什么通常被认为可以放入视图的代码隐藏中,什么是不可接受的,那将是很棒的。

谢谢

4

2 回答 2

2

首先,重要的是要记住,MVVM 就像您所说的那样,是一组指导方针而不是规则。有时它可能会有点粗略应该在哪里......

也就是说,在您的示例中,您有很多不是特定于 UI 的逻辑的逻辑

从硬盘加载图片绝对应该在 ViewModel 中完成。然后应该在 ViewModel 中的属性上设置图像。然后,视图中的图像控件应绑定ImageSource所述属性。

关于对话框(例如 OpenFileDialog) - 有 3 种有效的(恕我直言)方法可以做到这一点。

首先是创建一个由 ViewModel 调用的“FileChoosingService”,然后它会引发 OpenFileDialog 并返回文件名。

第二个选项是从视图中打开对话框,并将结果设置到视图模型中的属性中。视图模型将看到属性已更改,然后从硬盘加载图像。

第三个选项就像第二个一样,只是不设置属性,而是让视图LoadImageCommand在 ViewModel 中调用 a 并作为CommandParameter文件名传递。

于 2013-02-06T15:54:27.460 回答
1

一般的最佳做法是尽可能避免任何代码后面。听起来在这种情况下您可以避免它,而且这不仅仅是视图的问题。换句话说,它是一些可以应用于同一视图模型上的不同视图的逻辑。

此外,由于代码在后面的代码中,因此更难测试。您可能想测试用户是否选择了无效的图像文件,是否记录了错误等。当逻辑位于视图模型中时,这会更容易。

无论如何,这似乎也没有技术原因不会放在视图模型中。

要回答您的其他问题,您应该在视图模型中有一个公共属性,即当前图像,并且您应该在视图中使用数据绑定将该图像属性绑定到Image控件的源。

您还应该认真考虑使用 MVVM 框架。他们将提供一个已经实现的基本视图模型类型INotifyPropertyChanged

于 2013-02-06T15:57:48.320 回答