2011-01-13 52 views
1

我想要一些建議來實現這個功能與一個整潔的設計,沒有任何代碼複製。在大多數視圖中,我有一個包含許多視圖和網格控件的應用程序。我需要添加一個導出功能(導出記錄到excel)。網格控件支持這個OOB,只需要調用'Grid.Export()'。我正在計劃每個網格一側的UI按鈕並調用此方法。WPF UI場景 - 在50個視圖中添加功能的最佳方式?

所以,顯然我需要在代碼隱藏中編寫代碼,因爲我需要控件的實例來調用方法。但是,我喜歡將代碼保存在一個地方,並以某種方式調用所有Xamls中的代碼。 (所有WPF視圖)。

一種技術是編寫一個BaseView類並從中派生所有視圖。

但想知道如果WPF suppots任何技術,我可以實現這一點。 (行爲等..?)

感謝, 瑪尼

+1

這就是MVVM出現的地方......一個ViewModel適用於您的變化視圖,通過在ViewModel上定義並由View使用的DelegateCommand執行邏輯。 – 2011-01-13 18:02:52

+0

NO。該邏輯不能位於View Model中。 MVVM的重點在於分離UI和邏輯。在這裏,UI控件實例是必需的,不應該傳遞給視圖模型。 – 2011-01-14 10:38:58

回答

0

解決方案之一是使用WPF路由命令。

注:我寫了這個答案,假設你的「View」是Window類的一個子類。

首先,爲您的項目添加一個自定義路由命令。

public static class MyCommands 
{ 
    private static readonly RoutedUICommand exportCommand = new RoutedUICommand("description", "Export", typeof(MyCommands)); 

    public static RoutedUICommand ExportCommand 
    { 
     get 
     { 
      return exportCommand; 
     } 
    } 
} 

在每個視圖,設置自定義命令Button.Command並結合目標對象Button.CommandTarget。

<Button Command="local:MyCommands.ExportCommand" CommandTarget="{Binding ElementName=dataGrid1}">Export</Button> 

最後,在Application類(默認情況下命名爲App)中,在自定義命令和Window之間註冊命令綁定。

public partial class App : Application 
{ 
    public App() 
    { 
     var binding = new CommandBinding(MyCommands.ExportCommand, Export, CanExport); 
     CommandManager.RegisterClassCommandBinding(typeof(Window), binding); 
    } 

    private void Export(object sender, ExecutedRoutedEventArgs e) 
    { 
     // e.Source refers to the object is bound to Button.CommandTarget. 
     var dataGrid = (DataGrid)e.Source; 

     // Export data. 
    } 

    private void CanExport(object sender, CanExecuteRoutedEventArgs e) 
    { 
     // Assign true to e.CanExecute if your application can export data. 
     e.CanExecute = true; 
    } 
} 

現在,App.Export在用戶單擊按鈕時被調用。

樣品可用here

3

創建UserControl同時包含DataGrid和導出按鈕。實際上,使其成爲網格本身的一部分。

使用此UserControl而不是所有視圖中的默認數據網格,就完成了。此外,如果您需要修改按鈕或其行爲的外觀,您只有一個地方可以更改它,並且它會在所有視圖中更新。

+0

好吧,這是很多返工改變整個視圖的所有50多個意見。因此,想想是否有什麼我們可以做的行爲... – 2011-01-14 10:40:31

相關問題