2013-09-01 102 views
12

我寫了一個使用GUI生成sql查詢的工具,我想用MVVM和WPF重寫這個工具,每個sql列類型都有不同的控件,如下圖所示MVVM和控件的動態生成

enter image description here

我添加基於SQL柱類型的列濾波器控制,以及i使用代碼,就像我應用於櫥窗形式做生成控件。

  1. 在MVVM我讀過該視圖是使用XAML enteirly writtien, 確實MVVM套件這樣的應用,其中i有動態地添加不同的用戶 控制以堆疊面板?
  2. 控件將不存在於視圖中,除非某些列被雙擊,這意味着該控件在xaml中將不可用並且不會隱藏或摺疊。
  3. 有沒有什麼辦法可以避免代碼背後的綁定?
  4. 我應該爲每種列類型創建一個用戶控件嗎?
  5. 一般來說,使用mvvm開發具有複雜和動態UI的應用程序的最佳方法是什麼?
+4

XAML不是MVVM。和WPF!= MVVM。 WPF是MVVM的好朋友,XAML只是UI標記。 XAML-view不僅僅是XAML--它已經粘住了類(所謂的Code-Behind),但是你不應該將它用於主邏輯,儘可能少地使用它。 當然,您可以在代碼隱藏中實現控件生成,但這絕對不是MVVM **方法。 – oxfn

+3

@ user1590636你生成的GUI看起來非常漂亮,簡單 – WiiMaxx

+2

你讓你的女朋友嫁給你了嗎? – Purusartha

回答

13

猜猜我知道如何做到這一點,但它是非常複雜的東西。首先你應該理解MVVM的基本概念。 主視圖模型應該是ViewModels的ObservableCollection的類,它們中的每一個表示具有其數據和屬性的列。

interface IViewModel : INotifyPropertyChanged,IDisposable 
{ 
} 

interface IColumnViewModel : IViewModel 
{ 
} 

class ViewModelBase : IViewModel 
{ 
    // ... MVVM basics, PropertyChanged etc. ... 
} 

class MainViewModel : ViewModelBase 
{ 
    ObservableCollection<IColumnViewModel> Columns {get; set} 
} 

在查看我想是這樣ItemsControlItemTemplate,應與DataTemplate嵌入ContentControl,即應當由WPF根據列表項的綁定DataContext自動選擇。StackPanel本身不適合一點,但它可以被調用爲ItemsPanelTemplate

<Window 
    xmlns:v="clr-namespace:WpfApplication.Views" 
    xmlns:vm="clr-namespace:WpfApplication.ViewModels"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}"> 
      <v:TextColumnView/> 
     </DataTemplate> 
    </Window.Resources> 
    <ItemsControl 
     ItemsSource="{Binding Columns}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ContentControl Content="{Binding}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

所以,你應該建立視圖/視圖模型對每列類型。

希望,我的例子會有所幫助。祝你好運與你的女朋友和MVVM :)

1

那麼,你的觀點不是完全用XAML編寫 - 你在C#中生成控件。

我不認爲你會從重寫這個並將它裝入MVVM模具中獲得一些東西。只要保持現在的代碼,並享受。

+6

問題是我的女朋友不會嫁給我,如果我不使用MVVM,如果你是用MVVM寫這樣的東西,可以給我一個關於如何做的一般想法? – user1590636

+1

您還需要在代碼中創建綁定。 – zmbq

+1

@zmbq他不需要在代碼中創建綁定,他只需要使用一堆DataTemplates,它應該能夠以通用的方式顯示他的東西 – WiiMaxx

3

如果我理解正確的情景: 您可以使用數據模板&項目模板 比如我寫這將數據加載到集合,然後應用程序顯示了畫布面板在集合中的每個項目[或基於定義的數據模板。 ,敷penel項目是由集合本身同步內雙向綁定 您應該考慮使用可觀察集合來實現這一目標 然後你可以填寫收集和看到的視圖 結果我希望這有助於

3

在MVVM中寫這樣的東西,你會看到一個視圖,也就是你的內容區域。該視圖將具有視圖模型,該視圖模型的屬性之一將是視圖,或者該視圖模型的若干屬性將是視圖。這需要花費一些時間來包裝頭部,但如果正確使用控制反轉和依賴注入,則MVVM模式中視圖視圖非常易於管理。