我想创建一个显示图像的用户控件,并在单击时调用命令.后来我想将这些控件的列表绑定到产品列表.
下面是我的xaml.我在画布里面有一个图像.我想在图像上拖动鼠标时在图像上绘制矩形.我在WPF中成功完成了它.但现在我想在MVVM中做到这一点.我没有在代码中使用事件处理程序,而是希望将它们放在我的ViewModel中.我正在使用MVVM Foundation来实现MVVM.以下是MVVM Foundation的链接.http://mvvmfoundation.codeplex.com/
任何帮助都非常感谢.
XAML
<Canvas Name="cnvImage">
<Image Height="348" HorizontalAlignment="Left" Margin="12,39,0,0" Name="imgPreview"
Stretch="Fill" VerticalAlignment="Top" Width="443"
Source="/Images/CapturedImage.png"
MouseDown="imgCamera_MouseDown" MouseMove="imgCamera_MouseMove" MouseUp="imgCamera_MouseUp" />
</Canvas>
Run Code Online (Sandbox Code Playgroud)
用代码写的代码
// This is the rectangle to be shown when mouse is dragged on camera image.
private Point startPoint;
private Rectangle rectSelectArea;
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void imgCamera_MouseDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(cnvImage);
// Remove the drawn rectanglke if any.
// At a time only one …
Run Code Online (Sandbox Code Playgroud) 有人可以解释MVVM Foundation和MVVM Toolkit之间的差异吗?他们似乎有很多共同之处.
假设我有一个ViewModel TabViewModel
,它扩展ObservableObject
了MVVM Foundation Framework中ViewModels的类.然后我也有一个EditorTabViewModel
扩展TabViewModel
,现在我需要扩展DependencyObject
来实现DependencyProperties.我不能超过1班.我该如何实现呢?我可以有一个"中间"类,如......
TabViewModel : ObservableObject
EditorTabViewModel : TabViewModel
DependentEditorTabViewModel : DependencyObject
Run Code Online (Sandbox Code Playgroud)
但那是一个额外的不必要的课程.有更好的方法吗?
UPDATE
Ops实际上我不能做到以上.DependentEditorTabViewModel
仍然需要扩展EditorTabViewModel ...除了DependencyObject
我刚开始尝试使用Laurent Bugnion的MVVM Light Toolkit.我想我会非常喜欢它,但我有几个问题.
在我找到他们之前,让我解释一下我来自哪里.我目前使用Josh Smith的MVVM Foundation和Codeplex上另一个名为MVVM Toolkit的项目.我使用ObservableObject
并Messenger
从MVVM基金会DelegateCommand
,并CommandReference
从MVVM工具包.
MVVM Foundation和MVVM Tookit之间唯一真正的重叠是它们都有一个实现ICommand
:MVVM Foundation RelayCommand
和MVVM Tookit DelegateCommand
.在这两个中,DelegateCommand
似乎更复杂.它使用一个CommandManagerHelper
使用弱引用来避免内存泄漏.
话虽如此,这是我的问题:
为什么MVVM Light使用RelayCommand
而不是DelegateCommand
?是否使用弱引用是ICommand
不必要的还是因某些原因不推荐?
为什么ObservableObject
MVVM Light中没有?ObservableObject
基本上只是该ViewModelBase
实现的一部分INotifyPropertyChanged
,但是作为一个单独的类非常方便,因为视图模型不是唯一需要实现的对象INotifyPropertyChanged
.例如,假设您有一个绑定到Person
对象列表的DataGrid .如果Person
在用户查看DataGrid时可以更改任何属性,则Person
需要实现INotifyPropertyChanged
.(我意识到如果Person
使用类似LinqToSql的东西自动生成,它可能已经实现了INotifyPropertyChanged
,但是有些情况下我需要制作特定于视图的实体模型对象版本,比如说,因为我需要包含一个命令来支持DataGrid中的按钮列.)
谢谢.
PS以下是DelegateCommand
MVVM Toolkit 的代码:
https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU
我正在构建一个WPF应用程序并尝试符合MVVM最佳实践.我正在使用MVVM Foundation框架,并注意到我读过的Messenger类应该用于处理WPF中的对话框.这听起来很棒,但我完全不了解如何使用Messenger来实现此目的.从字面上看,我想要做的就是打开一个模态关于对话框 - 我不需要来回传递任何消息.
Messenger类的目的是用于对话框需要来自其父级的消息,还是将消息返回给其父级的情况?关于对话框是否有点过分?如果只是将代码添加到事件处理程序以显示对话框,我会更好吗?
MVVM问题.ViewModel和View之间的消息传递,如何最好地实现?
该应用程序有一些"用户通信"点,例如:"您已为此选择输入了注释.当"是/否/ NA"选择的值发生变化时,您是希望保存还是"丢弃".所以我需要一些被禁止的View绑定到ViewModel的"消息"的方式.
我从MVVM Foundation的Messenger开始走下去.然而,这更像是系统范围的广播,而不是事件/订户模型.因此,如果应用程序有两个View实例(Person1 EditView和Person2 EditView)打开,当一个ViewModel发布"您要保存"消息时,它们都会收到消息.
你用了什么方法?
谢谢安迪
我正在使用MVVM Foundation的SampleModel项目.Wwh ICommand
在_decrementCommand
声明为时返回RelayCommand
.我知道RelayCommand
继承ICommand
但不会更清楚只返回一个RelayCommand
?
public ICommand DecrementCommand {
get { return _decrementCommand ?? (_decrementCommand = new RelayCommand(() => --this.Value)); }
}
RelayCommand _decrementCommand;
Run Code Online (Sandbox Code Playgroud) 我只是想知道这是在MVVM中显示对话框的方式吗?
public ICommand OpenFileCommand
{
get
{
if (_openFileCommand == null) {
_openFileCommand = new RelayCommand(delegate
{
var strArr = DialogsViewModel.GetOpenFileDialog("Open a file ...", "Text files|*.txt | All Files|*.*");
foreach (string s in strArr) {
// do something with file
}
});
}
return _openFileCommand;
}
}
public class DialogsViewModel {
public static string[] GetOpenFileDialog(string title, string filter)
{
var dialog = new OpenFileDialog();
dialog.Title = title;
dialog.Filter = filter;
dialog.CheckFileExists = true;
dialog.CheckPathExists = true;
dialog.Multiselect = true;
if …
Run Code Online (Sandbox Code Playgroud) 我知道在这个线程中引入的一些 Mvvm 框架
请描述或给我链接它们有什么用?不是关于 MVVM 框架的 MVVM 信息。谢谢 :) 我想知道:什么是 MVVM 框架?
mvvm-foundation ×10
mvvm ×9
wpf ×8
c# ×4
.net ×2
dialog ×1
messenger ×1
mvvm-light ×1
mvvm-toolkit ×1