我經常在以下情況發現自己:事件循環性
我有一個用戶控件綁定到某些數據。每當控件更新時,底層數據都會更新。每當底層數據更新時,控件就會更新。所以很容易陷入永無止境的更新循環(控制更新數據,數據更新控制,控制更新數據等)。
通常我通過使用bool(例如updatedByUser
)來解決這個問題,所以我知道控件是否已經以編程方式或由用戶更新,然後我可以決定是否觸發事件以更新基礎數據。這看起來不太整齊。
是否有一些處理這種情況的最佳實踐?
編輯:我已經添加了下面的代碼示例,但我想我已經回答了我自己的問題......?
public partial class View : UserControl
{
private Model model = new Model();
public View()
{
InitializeComponent();
}
public event EventHandler<Model> DataUpdated;
public Model Model
{
get
{
return model;
}
set
{
if (value != null)
{
model = value;
UpdateTextBoxes();
}
}
}
private void UpdateTextBoxes()
{
if (InvokeRequired)
{
Invoke(new Action(() => UpdateTextBoxes()));
}
else
{
textBox1.Text = model.Text1;
textBox2.Text = model.Text2;
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
model.Text1 = ((TextBox)sender).Text;
OnModelUpdated();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
model.Text2 = ((TextBox)sender).Text;
OnModelUpdated();
}
private void OnModelUpdated()
{
DataUpdated?.Invoke(this, model);
}
}
public class Model
{
public string Text1 { get; set; }
public string Text2 { get; set; }
}
public class Presenter
{
private Model model;
private View view;
public Presenter(Model model, View view)
{
this.model = model;
this.view = view;
view.DataUpdated += View_DataUpdated;
}
public Model Model
{
get
{
return model;
}
set
{
model = value;
view.Model = model;
}
}
private void View_DataUpdated(object sender, Model e)
{
//This is fine.
model = e;
//This causes the circular dependency.
Model = e;
}
}
你使用的是什麼UI框架? WPF? UWP?的WinForms?每個人都有自己的首選方法 - 但通常歸結爲不同類型的MVC設計模式 – gilmishal
@gilmishal對不起,我忘了提及Winforms。 –
我想如果你展示一些創建循環更新的代碼 - 將更容易找到更合適的解決方案 – Fabio