在WPF中的两个用户控件之间发送命令
我正在尝试从一个UserControl
向另一个UserControl
发送命令。 第一个包含一个按钮,第二个包含一个派生自Border
类的自定义类。
我希望当我单击UserControl
的Button
以在UserControl
中的CustomBorder
中执行Redraw method
时。
这是我到目前为止所做的。
MainWindow.xaml:
的UserControl1:
UserControl2:
CustomBorder类:
using System.Windows; using System.Windows.Controls; namespace SendCommands { public class CustomBorder : Border { public void Redraw() { // Operations to redraw some elements inside the CustomBorder MessageBox.Show("We did it!"); } } }
ViewModel.cs:
namespace SendCommands { class ViewModel { } }
请有人帮助我一劳永逸地学习这个。 我是MVVM
概念的新手,我已经阅读了很多但没有结果。 我真的需要一个实用的解决方案才能使概念正确。
你的Redraw方法应该做什么? 如果某些属性发生变化,请更改边框 例如,商店里的商品已售罄?
通常,视图应反映ViewModel中的更改。 绑定会自动发生这种情况。 View元素(如按钮)可以与ViewModel通过命令进行通信。
因此,您的按钮将如下所示:
在您的ViewModel中,您将拥有一个
public DelegateCommand ClickCommand {get; private set;}
和
ClickCommand = new DelegateCommand(ExecuteClick);
ExecuteClick将更新视图模型中的某些属性,例如,如果您有在线商店,请将bike对象的SoldOut属性设置为true。
如果某些属性发生变化,您的视图将依次绑定到Bike的属性并更改其外观。 像文本这样的变化会自行发生,转换器可以实现更复杂的变化(例如,在SoldOut中将bckaground更改为红色为真):
SoldOutToBckgrConverter实现IValueConverter并将True转换为Red。
注意:SelectedItem再次绑定到一个列表,其源被绑定到像ViewModel上的ObservableCollection。
所以基本上你不应该调用redraw,它应该自动重写自己的命令,VM和绑定的变化。
更新您的评论:这是我试图展示的内容,因为我理解了您重绘的目的。 在我的产品示例和销售商品的红色背景中,这将如下所示:
在您的VM中:
public ObservableCollection Products {get;set;} private MyProduct selectedProduct; public MyProduct SelectedProduct { get {return selectedProduct;} set { if (selectedProduct != value) { selectedProducat = value; RaisePropertyChanged(()=>SelectedProduct; } } }
MyProduct具有Model属性(真实世界产品型号,即品牌)和SoldOut。
在您的视图中:
现在,当您单击按钮时,VM将更改SelectedProduct和Binding cahnges背景(或边框..)
您可以使用Expression Blend提供的“CallMethodAction”行为。 将System.Windows.Interactivity.dll添加到您的项目,您可以将方法绑定到事件。 在您的情况下,“ReDraw”方法必须绑定到“Click”事件。 有关此行为的更多信息。