2012-02-09 73 views
0

我正在WPF/XAML中處理我的第一個項目,並且還有很多我沒弄清楚。用戶控件通過命令進行通信 - 如何?

我的問題很簡單 - 我需要一個窗口,在頂部有一堆字段,用戶將使用它輸入他的選擇標準,檢索按鈕和數據網格。當用戶點擊按鈕時,將運行查詢,並使用結果填充網格。

現在,實現這一點的簡單而明顯的錯誤方法是讓一個單獨的模塊包含一個窗口,並在其中包含所有內容 - 輸入字段,數據網格和工程。這種責任的磨損使得不可維護的混亂。

所以我所擁有的是一個窗口,它只負責佈局,它包含兩個用戶控件 - 一個包含輸入字段和檢索按鈕的條件控件,以及一個包含數據網格的數據顯示控件。

問題是如何讓兩個人互相交談。

年前,我會添加一個指向標準控件的函數指針。窗口將它設置爲指向顯示控件中的一個函數,並且當單擊該按鈕時,它將調用顯示控件,傳遞選擇標準。

最近,我會添加一個事件到標準控制。我會讓窗口在顯示控件中設置一個處理程序來監聽事件,並且當按鈕被點擊時,它會引發事件。

這兩種機制都可以在WPF中工作。但是這兩個都不是XAMLish。在我看來,WPF已經專門提供了ICommand接口來適應這些類型的連接問題,但我還沒有真正弄清楚它們是如何工作的。而且我看到的例子都不符合我的簡單情況。

任何人都可以給我一些關於如何適應ICommand這個問題的建議嗎?或者直接在網上給我一個體面的解釋?

謝謝!

回答

1

MVVM是WPF和Silverlight開發中使用的流行模式。你應該閱讀它。

本質上,你將有一個視圖模型,公開一個命令來執行搜索。相同的視圖模型也會顯示每個標準字段的屬性。然後,將期(縣)將綁定到視圖模型的各種屬性:

<TextBox Text="{Binding NameCriteria}"/> 

... 

<Button Command="{Binding SearchCommand}".../> 

... 

<DataGrid ItemsSource="{Binding Results}"/> 

如果您的視圖模型看起來是這樣的:

public class MyViewModel : ViewModel 
{ 
    private readonly ICommand searchCommand; 
    private string nameCriteria; 

    public MyViewModel() 
    { 
     this.searchCommand = new DelegateCommand(this.OnSearch, this.CanSearch); 
    } 

    public ICommand SearchCommand 
    { 
     get { return this.searchCommand; } 
    } 

    public string NameCriteria 
    { 
     get { return this.nameCriteria; } 
     set 
     { 
      if (this.nameCriteria != value) 
      { 
       this.nameCriteria = value; 
       this.OnPropertyChanged(() => this.NameCriteria); 
      } 
     } 
    } 

    private void OnSearch() 
    { 
     // search logic, do in background with BackgroundWorker or TPL, then set Results property when done (omitted for brevity) 
    } 

    private bool CanSearch() 
    { 
     // whatever pre-conditions to searching you want here 
     return !string.IsEmpty(this.NameCriteria); 
    } 
} 
+0

是的,我使用的視圖模型。我沒有提到它,因爲這不是問題所在。我可以在顯示控件的視圖模型中定義一個方法,並公開執行它的命令。將它綁定到顯示控件視圖中的UI元素將很簡單。但那不是我的問題。我需要從UI控件觸發命令,該控件沒有 - 也不應該 - 訪問顯示控件的視圖模型。 – 2012-02-09 20:40:40

+0

@Jeff:在這種情況下,只需使用一個事件聚合器,它允許分離的組件進行協作。棱鏡有一個,或者你可以從其他地方抓一個或寫你自己的。 – 2012-02-10 07:37:18

+0

這似乎是嚴重矯枉過正的問題,因爲兩個控件在同一窗口中彼此交談時受到限制。 – 2012-02-10 14:14:03