我想处理窗口中的"Closing"事件(当用户点击右上角的"X"按钮时),以便最终显示确认消息或/并取消关闭.
我知道如何在代码隐藏中执行此操作:订阅窗口的"Closing"事件,然后使用"CancelEventArgs.Cancel"属性.
但我正在使用MVVM,所以我不确定这是一个好方法.
我认为好的方法是将Closing事件绑定到ViewModel中的Command.
我试过了:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding CloseCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)
在我的ViewModel中使用关联的RelayCommand但它不起作用(命令的代码未执行).
我无法理解BorderThickness="{TemplateBinding BorderThickness}.这里的代码:
<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
<Border Padding="{TemplateBinding Padding}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
另请解释其他类型的绑定.
有人可以快速总结一下ViewModelLocator是什么,它是如何工作的,以及与DataTemplates相比使用它的优缺点是什么?
我曾尝试在Google上查找信息,但似乎有许多不同的实现,并没有关于它是什么以及使用它的优点/缺点的严格列表.
有谁知道使用MVVM Light Toolkit创建的opensource WPF应用程序?或者任何样品?
我正在修改我的软件,它有杂乱的Messenger.Default(...)位.
有没有任何备忘单知道MVVMLight SimpleIoc用法(不是一般的IoC描述)?
我在我的WPF应用程序中使用MVVM Light工具包.我想知道从现有窗口打开新窗口的最佳方法是什么.我有这个MainViewModel,负责MainWindow我的申请.现在,MainView按下按钮,我想打开它上面的第二个窗口.我有RelayCommmand绑定到Button的Command.在RelayCommand方法中,我可以创建一个新的窗口对象,只需调用Show(),如下所示:
var view2 = new view2()
view2.Show()
Run Code Online (Sandbox Code Playgroud)
但我不认为ViewModel应该负责创建新view2对象.我已经阅读了这篇文章WPF MVVM从VIEW MODEL获取Parent,其中Bugnion建议将消息传递给view1from viewmodel1,然后view1应该创建新的view2.但是我不确定他将这条消息传递给他的意思是view1什么?如何view1处理消息?在它的代码背后或什么?
此致,Nabeel
我在使用GalaSoft MVVM Light框架将参数传递给relaycommand时遇到问题.我知道mvvm light的relay命令的实现不使用lambda参数,所以我做了一些研究,并找到了一种方法,人们通过做这样的事情来解决它:
public RelayCommand ProjMenuItem_Edit
{
get
{
if (_projmenuItem_Edit == null)
{
//This should work....
_projmenuItem_Edit = new RelayCommand(ProjEditNode);
}
return _projmenuItem_Edit;
}
}
private void ProjEditNode(object newText)
{
var str = newText as string;
OrganLocationViewModel sel =
ProjectOrganLocationView.GetExtendedTreeView().GetTopNode();
//Console.WriteLine(sel.OrganDisplayName);
sel.OrganDisplayName = str;
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直在_projmenuItem_Edit = new RelayCommand(ProjEditNode);说错误Argument 1: cannot convert from 'method group' to 'System.Action'
我错过了什么?
我喜欢MVVM Light的Messenger及其灵活性,但是当我忘记明确取消注册收件人时(在Silverlight 4中),我遇到了内存泄漏.
原因在这里解释,但我很好,因为我认为明确取消注册收件人是一个好习惯,而不是依赖于Messenger使用弱引用.问题是说起来容易做起来难.
ViewModel很简单:您通常可以完全控制它们的生命周期,并且可以Cleanup()在不再需要它们时使用它们.
另一方面,视图更加棘手,因为它们是通过DataTemplates实例化和销毁的.对于前者 你可以把ItemsControlwith MyView和DataTemplate 想象成一个ObservableCollection<MyViewModel>.该MyView控件创建/绑定引擎收集的,你有没有什么好办法对他们手动调用清理().
我有一个解决方案,但想知道它是否是一个体面的模式或有更好的选择.我们的想法是从ViewModel发送一条特定的消息,告诉相关的View处理:
public class MyViewModel : ViewModelBase
{
...
public override void Cleanup()
{
// unregisters its own messages, so that we risk no leak
Messenger.Default.Unregister<...>(this);
// sends a message telling that this ViewModel is being cleaned
Messenger.Default.Send(new ViewModelDisposingMessage(this));
base.Cleanup();
}
}
public class MyView : UserControl, ICleanup
{
public MyView()
{
// registers to messages it actually …Run Code Online (Sandbox Code Playgroud) 我有一个WPF应用程序,它显示一个绑定到命令的按钮:
<Button Command="{Binding Path=TestrunStartCommand}" Content="GO!">
Run Code Online (Sandbox Code Playgroud)
该命令定义如下:
public ICommand TestrunStartCommand
{
get { return new RelayCommand(TestrunStartExecute, () => !IsTestrunInProgress); }
}
public bool IsTestrunInProgress
{
get{
return _isTestrunInProgress;
}
set{
_isTestrunInProgress = value;
RaisePropertyChanged(IsTestrunInProgressPropertyName);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我设置IsTestrunInProgress为false 后不会立即启用该按钮,但只有在我单击应用程序窗口后才会启用.
你能帮我理解这个行为并告诉我如何解决这个问题吗?
进一步阅读: wpf命令模式 - 何时查询canexecute
我现在在WPF中有点过时,并且有兴趣听到人们对最新版本的Prism(我之前使用过几个版本)和MVVM Light + Unity方法(我从未做过)的看法 - 体面的例子URL会很好).
我的项目将是一个很大的项目,包括由几个开发人员编写的多个模块 还有资金引入第三方控制套件,以便使用其中一个花哨的Docking/Workspace布局管理器建立一个漂亮的工作区(我知道Prism区域的一些比其他区域更好).
如果你现在从头开始一个项目,你会选择什么?为什么?有关特定推荐体系结构模式的详细信息将非常有用(例如,自动发现模块dll?注入日志记录服务?).基本上,任何想法和建议都会很好.我想进行一次很好的讨论.也许完全有另一个方向你建议进去?我非常处于研究阶段,并希望尽可能多的输入.
我把它放在这里因为我认为它会比Prism/MVVM Light论坛获得更少的偏见,但是,如果有更适合这个问题的地方,请指出我的方向.
mvvm-light ×10
wpf ×8
c# ×7
mvvm ×5
.net ×1
datatemplate ×1
prism ×1
relaycommand ×1
silverlight ×1
toolkit ×1