2011-08-30 55 views
3

我一直在使用mvvm來開發一個RIA服務sl4應用程序,我似乎錯過了一些東西。MVVM數據模板和非直接數據映射

當您的數據以預期的格式進行編輯或數據對象「符合視圖」(網格,列表等)時,MVVM和數據綁定可以很好地工作。但是當你的數據不直接映射時會發生什麼?

我的例子

可以說我有一個產品表,這個定義的產品其價格和選項。我有一個訂閱的產品表,將鏈接產品和客戶端,也有關於何時訂閱結束等數據...

因此,當我開始工作我的「購物清單」的觀點我做到了這一點:

<ListBox x:Name="ShopList" Grid.Row="0" ItemsSource="{Binding Products}"> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <sdk:Label Content="{Binding ModuleName}" /> 
       <sdk:Label Content="{Binding DateStart, Converter={StaticResource gridDateFormatter}}" /> 
       <sdk:Label Content="{Binding DateEnd, Converter={StaticResource gridDateFormatter}}" /> 
       <telerik:RadMaskedTextBox MaskedText="{Binding UnitsToBuy}" /> 
       <sdk:Label Content="{Binding UnitStep}" /> 
       <sdk:Label Content="{Binding TotalPrice}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox> 

所以,我想好了,我有觀察集合要綁定的ItemsSource我的視圖模型

public ObservableCollection<Product> Products 

但現在我有一個問題,UnitsToBuy東西不在產品,而不會屬於產品。我正在努力尋找一種乾淨的方式來處理這種情況。假設我可以在該列表中擁有任意數量的項目。

謝謝。

+0

UnitsToBuy是另一個Model對象的一部分還是全部是它自己?我想我的問題是你是否試圖合併兩個模型。 – avanek

+0

@avanek以及它將在另一個模型中使用,可以說SubscribedProduct模型/表 – GriffinHeart

回答

3

我想你問歸結到該視圖需要與更多的屬性,不是一個簡單的模型視圖模型的事實。爲什麼不能有這樣的事情。顯然,下面的類應該實現INotifyPropertyChanged。

public class CartItem 
{ 
    public Product Product {get;set;} 
    public int UnitsToBuy {get;set;} 
    public int UnitsStep {get;set;} 
    public decimal TotalPrice 
    { 
    get { return Product.Price * UnitsToBuy;} 
    } 
    //more properties can be added if needed 
} 

public class ShoppingCartViewModel 
{ 
    public ObservableCollection<CartItem> Products {get;set;} 
} 

然後在xaml中,您並不需要做任何更改。

0

我會創建一個新的Model類,它將包含您需要的Product和SubscribedProduct。然後,您可以創建一個映射器,將更多以視圖爲中心的模型轉換爲以數據爲中心的模型(產品和訂閱產品)。

0

我總是爲一個模型或一組模型構建我的視圖。正因爲如此,我知道哪些屬性值得期待,哪些屬性可能會丟失。

如果我知道屬性可以缺少,我會寫一個DataTrigger改變基於數據

舉例來說,如果我有這樣的應該是顯示ProductsSubscribedProducts一個觀點,我可能會在視圖使用DataTrigger確定什麼的DataTemplate顯示

<Style TargetType="ListBoxItem"> 
    <Setter Property="Template" Value="{StaticResource DefaultProductTemplate}" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Converter={StaticResource ObjectToTypeConverter}}" Value="{x:Type local:SubscribedProductModel}"> 
      <Setter Property="Template" Value="{StaticResource SubscribedProductTemplate}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

不要以爲這就是我要找的,我不是試圖展示產品和訂閱產品,我試圖展示一個產品的購物清單,但它自己的產品只是它的描述而不是它的「選項」(有多少個單位可以購買)。這似乎不符合控制的約束機制。 – GriffinHeart

+1

@GriffinHeart你需要一個不同的'Model'。不應期望您的產品追蹤購買的產品數量和總價格,因爲這類數據屬於'ProductOrder',而不是'Product'。您應該使用'Product','Amount'和'TotalPrice'創建一個'ProductOrder'類,它將是'Amount * Product.UnitPrice'。 – Rachel