在WPF中的两个用户控件之间发送命令

我正在尝试从一个UserControl向另一个UserControl发送命令。 第一个包含一个按钮,第二个包含一个派生自Border类的自定义类。

我希望当我单击UserControlButton以在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”事件。 有关此行为的更多信息。