我在编程方面相对较新,经过数小时的研究后我无法找到问题的解决方案。我在Silverlight应用程序上,我希望在两个代码后面进行通信。
我有两个不同的视图显示在一个,每个视图都有一个视图模型,当然后面的代码,在这个视图之一我有一个按钮,当我点击这个按钮,我想开始一个第二个代码后面的方法,以影响显示。
为了解决我的问题,经过一些研究,我认为我应该使用依赖属性,所以这就是我所做的:
在我视图后面的第一个代码中,如果属性发生更改,我已使用方法注册了依赖项属性:
//i registered here my property, in the code behind my view "P_Recherche"
public static readonly DependencyProperty BoolClickDemandeProperty = DependencyProperty.Register("Customer", typeof(bool),
typeof(P_Recherche), new PropertyMetadata(false, OnCustomerChangedCallBack));
public bool Customer
{
get { return (bool)GetValue(BoolClickDemandeProperty); }
set { SetValue(BoolClickDemandeProperty, value); }
}
private static void OnCustomerChangedCallBack(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
P_Recherche c = sender as P_Recherche;
if (c != null)
{
c.OnCustomerChanged();
}
}
//Here is the method/code that i want to start after a "call" (in reality after an update of my boolean) of my other view
protected virtual void OnCustomerChanged()
{
bool testDemande = viewModel.ClickDemande();
if (testDemande)
{
this.posts.DataContext = new vm_Demande();
MinimizeDemandeCall();
MinimizeFamilleCall();
MaximizePostCall();
}
}
在第二个视图中,在后面的代码中,我已经为我的依赖属性声明了一个属性,如下所示:
public bool Customer
{
get { return (bool)GetValue(P_Recherche.BoolClickDemandeProperty); }
set { SetValue(P_Recherche.BoolClickDemandeProperty, value); }
}
我在按钮单击事件中使用它,我在其中更改属性的值以启动我在注册我的依赖项属性时声明的方法:
private void BtNewDemande_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Customer = true;
}
当我点击这个按钮时,我有一个类似&#34的依赖;不能在类型"的对象上设置依赖属性。 (对不起,我的VS2013不是英文版)所以我想我错过了一些东西......但在我花了这么长时间后,我无法找到解决问题的方法...非常感谢您的帮助 !我为糟糕的英语道歉:)
答案 0 :(得分:0)
我建议您使用完全不同的方法,并避免滥用DP-PropertyChanged机制来传播按钮单击。
让我们退一步思考会发生什么:用户点击某处。这发生在某个时间点。据我所知,从你的帖子来看,这不会改变任何数据,它不会改变与你的域逻辑相关的状态,它只会改变UI的大部分显示。就像在某处单击展开按钮或打开ComboBox的下拉列表一样。
所以这是视图间通信,因此我也不会将它传播到视图模型中。
我会在这里使用一个普通的老事件。 让我告诉你:
public class InnerViewWithButton : UserControl
{
public InnerViewWithButton()
{
InitializeComponent();
InnerButton.Click+=(sender,args)=>RaiseInnerButtonClicked();
}
public event EventHandler InnerButtonClicked;
private void RaiseInnerButtonClicked()
{
var clickHandlers = InnerButtonClicked;
if (clickHandlers != null) clickHandlers(this, EventArgs.Empty);
}
}
public class InnerViewWithMethod : UserControl
{
...ctor...
public void DoSomeMagic()
{
...
}
}
public class OuterView : UserControl
{
public OuterView()
{
InitializeComponent();
MyInnerViewWithButton.InnerButtonClicked +=
(sender,args) => MyInnerViewWithMethod.DoSomeMagic();
}
}