對於基於 UserControl 的 WPF 架構放棄 MVVM 是什麼體驗?
我們使用Infragistics控制項基於Composite Application Library和MVVM建構了一個大型應用程序。
為了節省時間並使應用程序更直接,我們取消了 MVVM 要求。我們現在沒有 Presenters 或 ViewModels,我們的 Views 已經變成了簡單的 UserControls,它是這樣創建的:
BaseEditor.cs:
using System.Windows.Controls; namespace App { public class BaseEditor : UserControl { public string Title { get; set; } public BaseEditor() { Title = "This was defined in the Base Editor."; Loaded += new System.Windows.RoutedEventHandler(BaseEditor_Loaded); } void BaseEditor_Loaded(object sender, System.Windows.RoutedEventArgs e) { StackPanel sp = new StackPanel(); TextBlock tb = new TextBlock(); tb.Text = Title; sp.Children.Add(tb); this.Content = sp; } } }客戶編輯器.cs:
namespace App { public class CustomerEditor : BaseEditor { public CustomerEditor() { Title = "This was overwritten by the CustomerEditor."; } } }Window1.cs.xaml:
<Window x:Class="App.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:App" Title="Window1" Height="300" Width="300"> <Grid> <local:CustomerEditor/> </Grid> </Window>除了可測試性問題以及像這樣執行 WPF 的“感覺很髒”的事實之外,我只從這個決定中感受到了積極的影響,例如:
- 我們可以從彼此繼承我們的非 XAML 使用者控制項
- 我們使用盡可能多的程式碼隱藏來加速開發
- 將 infragistic 控制項直接附加到來自 Web 服務的模型類清除了我們在將 Infragistics 綁定到 ObservableCollections 時遇到的許多小綁定問題
- 即使在直接的 WPF 中,缺少 ObservableCollections 也會使諸如無法創建簡單菜單的問題消失
- 我們正在使用 UserControls 和程式碼後面的直接事件一一替換 EventAggregator,這清除了事件的各種問題
有沒有其他人在 WPF 中做 MVVM 有類似的經歷?從長遠來看,您是否遇到過任何實際問題?
我們可以從彼此繼承我們的非 XAML 使用者控制項
我不明白。MVVM 會怎樣排除繼承?
我們使用盡可能多的程式碼隱藏來加速開發
只要是與視圖相關的程式碼,程式碼隱藏就可以了。IE。不是您要測試的業務邏輯。關注點和所有的分離。
你仍然可以在用程式碼做所有事情的同時做 MVVM——甚至是你的視圖。MVVM 不是零程式碼。這是關於分離關注點和從中獲得的好處。如果您不需要在 Blend 中設計您的視圖,那麼無論如何您都可以將大部分或全部視圖顯示為程式碼。哎呀,即使您確實需要在 Blend 中工作,也有一定數量的視圖仍然可以表現為程式碼。您只需要評估權衡並做出有意識和明智的決定。
將 infragistic 控制項直接附加到來自 Web 服務的模型類清除了我們在將 Infragistics 綁定到 ObservableCollections 時遇到的許多小綁定問題
Infragistics 控制非常差。在那裡,我說了算。如果這是一個選項,請不要使用它們。如果它不是一個選項(我也曾擔任過這個職位),您通常可以解決許多與附加行為和其他技術有關的問題。是的,這很麻煩,但不要責怪 MVVM - 責怪 Infragistics 生成了一個與 WPF 平台如此不一致的控制集。
即使在直接的 WPF 中,缺少 ObservableCollections 也會使諸如無法創建簡單菜單的問題消失
我完全不明白這一點。ObservableCollections 是 WPF 的一部分,而不是 MVVM。並且閱讀了您的問題(再次 - 我在您送出後不久就回復了它)我會說這只是您對 WPF 如何工作的誤解 - 與 MVVM 完全無關。
我們正在使用 UserControls 和程式碼後面的直接事件一一替換 EventAggregator,這清除了事件的各種問題
適合工作的正確工具。如果您能夠使用直接事件,那麼無論您是否使用 MVVM,您都可以這樣做。MVVM 無論如何都不需要使用事件聚合器模式,所以你的觀點也不清楚。事件聚合器模式可用於確保不同的組件可以在執行時協作,而無需任何編譯時依賴。通過使用標準 CLR 事件,您可以在組件之間創建強依賴關係。如果您想單獨使用它們,那麼您將度過一段美好的時光。
總而言之,這並沒有太大的針對 MVVM 的案例,而更多的是缺乏理解。我認為你正在逆流而上,我建議你仔細看看 MVVM。它不是靈丹妙藥或一刀切的模式,但如果使用得當,它肯定有助於為您的 WPF/SL 應用程序創建出色的基礎。