2013-10-01 42 views
0

我是WPF和C#的新手,試圖瞭解如何從BL類更新UI元素(以保持邏輯和UI之間的分離)bl從C++獲取定期更新網絡組件,並且應該在新參數出現後更新表單(我在msdn網站上閱讀,但我希望看到一些具體的示例以確保其正確)定期更新wpf標籤

+1

在做這件事之前,你應該閱讀一下UI設計模式,尤其是MVVM,它將邏輯和UI分開。在WPF中,UI控件通常綁定到視圖模型類中的屬性,所以您應該讓自己熟悉[WPF中的數據綁定](http://msdn.microsoft.com/zh-cn/library/ms752347.aspx)。下一步將要了解如何從[後臺線程]安全地更新綁定源屬性(http://msdn.microsoft.com/zh-cn/library/ms741870.aspx)。聽起來很像要學習(事實上),但這是值得的。 – Clemens

+0

簡單的方法是隻更新[Dispatcher.Invoke](http://msdn.microsoft.com/en-us/library/hh199416.aspx)調用中的TextBlock或Label控件。 – Clemens

回答

1

由於您的定期從C++網絡組件評論,我假設你已經有一個系統來更新你的財產。我會在視圖模型類中公開您的業務類中的財產,這是一個具有公共屬性的類,並且專門設計用於將所有必需數據提供給視圖的函數或UserControl。老實說,我不會在商務課(具體取決於商務課的意思)中擁有那個(或任何)功能......我會親自把它直接放到視圖模型中,或者有一個經理/服務類,暴露它。

如果您堅持保持它在原地,您必須在您的業務類中實施eventdelegate,以便可以提醒該類用戶何時更改值。然後,您可以簡單地將視圖模型類中的處理程序附加到event/delegate,並在實際屬性更改時輕鬆更新公開的屬性。

因此,它會在你的商務課中出現這樣的情況......(我假設你的價值是int,但如果它不正確,你可以改變它......校長是一樣的):

public delegate void FieldUpdate(int value); 

public FieldUpdate OnFieldUpdate { get; set; } 

... 

private int field; 

public int Field 
{ 
    get { return field; } 
    set 
    { 
     if (value != field) 
     { 
      field = value; 
      if (OnFieldUpdate != null) OnFieldUpdate(field); 
     } 
    } 
} 

然後在您的視圖模型:

private YourBusinessClass instance = new YourBusinessClass(); 

public YourBusinessClass Instance 
{ 
    get { return instance; } 
    set { instance = value; NotifyPropertyChanged("Instance"); } 
} 

附加的處理程序:

instance.OnFieldUpdate += OnBusinessClassFieldUpdate; 

... 

public void OnBusinessClassFieldUpdate(int value) 
{ 
    Instance = value; 
} 

現在,無論何時在業務類中更新字段,視圖模型(以及數據綁定的UI控件)都將通過delegate自動更新。