2011-08-30 1 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> 

그래서 난 내 뷰 모델에

public ObservableCollection<Product> Products 

관찰 가능한 컬렉션 ItemsSource 바인딩거야 잘 생각하지만 지금은 문제가있다는 UnitsToBuy은하지 않는 제품에 뭔가이며,하지 않습니다 제품에 속한다. 나는 이런 종류의 시나리오를 다루는 깨끗한 방법을 찾는 방법에 대해 열중하고 있습니다. 내가 그 목록에있는 항목의 개수를 가질 수 있다고 가정하십시오.

감사합니다.

+0

UnitsToBuy는 다른 Model 객체의 일부입니까? 아니면 모두 단독입니까? 내 질문에 당신이 두 모델을 함께 병합하려고하는지 여부 같아요. – avanek

+0

@avanek 잘 다른 모델에서 사용됩니다, SubscribedProduct 모델/테이블을 말하십시오 – GriffinHeart

답변

3

를 표시 할 작업을 결정하기 위해 DataTrigger를 사용 나는 무엇을 요구하는지하면보기 이상의 속성이 아니라 단순한 모델과 뷰 모델을 필요로한다는 사실로 귀결 생각합니다. 왜 이런 식으로하지 마십시오. 당연히 아래 클래스는 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;} 
} 

그런 다음 실제로 변경하지 않아도됩니다.

0

Product 및 SubscribedProduct에서 필요한 것을 포함 할 새로운 Model 클래스를 만들겠습니다. 그런 다음 더 많은 뷰 중심 모델을 데이터 중심 모델 (Product 및 SubscribedProduct)로 변환 할 수있는 매퍼 (Mapper)를 만들 수 있습니다.

0

저는 항상 모델 또는 모델 그룹에 대한 내 뷰를 항상 빌드합니다. 이 때문에 어떤 속성이 기대되는지, 어느 특성이 누락 될 수 있는지 알고 있습니다.

나는 속성이 누락 될 수 있습니다 알고있는 경우에, 나는 데이터 예를 들어

, 내가 디스플레이 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 다른 '모델'이 필요합니다. 당신의 제품은 구매할 단위의 수와 총 가격을 추적하지 않아야합니다. 왜냐하면 그러한 종류의 데이터는'Product'가 아닌'ProductOrder'에 속하기 때문입니다.'Product','Amount','TotalPrice'로'ProductOrder' 클래스를 생성해야합니다.이 클래스는'Amount * Product.UnitPrice'입니다. – Rachel