好的,所以我有一个用户控件,它使用底层业务逻辑类的值。我需要一些方法让用户控件监听类并在调用某些方法/在BL类上更新值时触发。
在高层次上,最好的方法是什么?我知道在BL类中需要某种形式的事件,我的用户控件中有一个监听器,但是如果有人有任何建议的话,只是想知道最好的方法吗?
答案 0 :(得分:2)
应该监听的类必须实现INotifyPropertyChanged
接口,而usercontrol必须订阅它。让我给你看一个简短的样本。这是一个具有属性并且通常会对其进行更改的类:
public class MyClass : INotifyPropertyChanged
{
private string myProperty;
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
var temp = PropertyChanged;
if (temp != null)
{
temp(this, new PropertyChangedEventArgs(propertyName));
}
}
public string MyProperty
{
get { return myProperty; }
set
{
if (myProperty != value)
{
myProperty = value;
RaisePropertyChanged("MyProperty");
}
}
}
}
您的usercontrol应订阅PropertyChange事件,并会在每次更改时收到通知。
答案 1 :(得分:1)
这就是事件的用途。
Here's a good tutorial on Events.
基本上,您将在商务舱中创建一个活动:
public event EventHandler MyEvent;
当事情发生时(也在您的商务舱中)举起活动:
if(MyEvent != null) MyEvent(this, EventArgs.Empty);
事件的参数将根据事件的类型而有所不同。
在您的消费者类中,您订阅了这样的事件“
MyEvent += new EventHandler(MyMethod);
public void MyMethod(object sender, EventArgs e) { }
// OR
MyEvent += delegate(object sender, EventArgs e) { };
答案 2 :(得分:1)
嗯,通常BL对象是服务器端,而你的'用户控件'将在客户端。 更改BL对象到达连接的客户端比仅仅简单的事件更复杂。 您需要让您的服务器能够联系您的客户。为此,您需要使用一些技术,如长轮询或套接字。
*编辑* 我过去曾使用WebSync来满足这些需求。这是一种商业产品。你可能想看看SignalR。这是斯科特H关于它的一个伟大的blog post。这是开发的,而不是新的开源,但我还没有使用它。
*编辑2 * 现在我明白了你在找什么。您需要使用Ajax请求来处理您的购物车。从客户端(浏览器),您需要向后端服务提交一些数据。发布数据时,您需要定义成功/失败的回调函数。您需要在此回调中刷新购物车。
按照这个tutorial,它会让你很清楚你需要做些什么来实现这个目标