Dot-Net

對於基於 UserControl 的 WPF 架構放棄 MVVM 是什麼體驗?

  • September 24, 2015

我們使用Infragistics控制項基於Composite Application LibraryMVVM建構了一個大型應用程序。

為了節省時間並使應用程序更直接,我們取消了 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 應用程序創建出色的基礎。

引用自:https://stackoverflow.com/questions/1510041