2016-11-17 14 views
1

템플릿 10을 사용하는 UWP의 주문 양식은 주문에 제품을 추가합니다. 이 오류는 관련 XAML 조각이 OrderViewModel과 ProductViewModelUWP 앱의 ViewModel에서 속성을 찾을 수 없습니다.

namespace ViewModels 
{  
    public class OrderViewModel : ViewModelBase 
    { 
     public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>(); 

     public void FindProduct_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args) 
     { ... } 
    } 

    public class ProductViewModel : ViewModelBase 
    { 
     string _ItemCode = default(string); 
     public string ItemCode { get { return _ItemCode; } set { Set(ref _ItemCode, value); } } 

     public ProductViewModel() 
     { 
     } 
    } 
} 

에서 관련 조각이 어떻게 올바르게에서 OrderViewModelFindProduct_TextChanged를 참조

<Page.DataContext> 
    <ViewModels:MainPageViewModel x:Name="OrderViewModel" /> 
</Page.DataContext> 

<GridView ItemsSource="{x:Bind OrderViewModel.Products, Mode=TwoWay}"> 
    <GridView.ItemTemplate> 
     <DataTemplate x:DataType="ViewModels:ProductViewModel" > 
      <AutoSuggestBox 
       Name="ProductAutoSuggestBox" 
       TextMemberPath="{x:Bind ItemCode, Mode=TwoWay}" 
       TextChanged="{x:Bind OrderViewModel.FindProduct_TextChanged}"> 
      </AutoSuggestBox> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 

입니다

Invalid binding path 'OrderViewModel.FindProduct_TextChanged' : Property 'OrderViewModel' can't be found on type 'ProductViewModel'

입니다 GridView에 대한 DataTemplate은 ProductViewModel을 참조합니다. ?

+2

ItemsSource로'OrderViewModel.Products'를 사용하면'x : DataType'이'Product'이어야하고'FindProduct_TextChanged' 메소드가 있어야한다는 것을 의미합니다. – tao

+0

@tao 감사합니다. 무슨 뜻인지 잘 모르겠다. 'Product'는'OrderViewModel'의 멤버는 아니지만'Products'는'OrderViewModel'의 멤버입니다. 'FindProduct_TextChanged'는'OrderViewModel.Products'를 갱신하여'OrderViewModel'이 아닌 다른 곳에 넣을 수는 없습니다. 아니면 내가 잘못 이해 한거야? 무슨 뜻인지 설명하기 위해 코드 스 니펫을 제공 할 수 있습니까? – Vague

답변

3

@ tao의 의견에 투표했습니다. @Vague, 나는 당신이 무엇을 x:DataType이 사용되는지 오해 할 것 같아요. Data binding in depth의 일부 : 당신은 "데이터 형식의 DataTemplate 및 X"를 참조 할 수 있습니다

사용 : 그 바인딩 검증 (그들에 대해 생성 효율적인 코드)에서 할 수 있도록 데이터 템플릿에 {X 바인딩} 컴파일 할 때 DataTemplate은 x : DataType을 사용하여 데이터 객체의 유형을 선언해야합니다. 당신의 시나리오의

은, 코드 public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();에서, 당신의 DataTemplate의 데이터 객체의 유형은 Product 클래스가 아니라 ProductViewModel해야하고, 그 사이에, 당신의 FindProduct_TextChanged 이벤트는이 Product 클래스에서 찾을해야 이는 코드 FindProduct_TextChangedProduct 데이터 모델에 배치되어야 함을 의미합니다.

그런데 ItemsSource에는 TwoWay 바인딩을 사용할 필요가 없다고 생각합니다. 이 시나리오의 경우 바인딩 대상은 이고 바인딩 소스는 ObservableCollection<Product> Products입니다. 컬렉션이 업데이트되면 GridView을 업데이트하려는 것으로 알고 있습니다.이 작업은 ObservableCollection으로 완료됩니다. 게다가 여기에 바인딩 소스 만 바인딩 대상을 알리기 위해 변경할 수 있으므로 OneWay 바인딩이면 충분합니다. 하지만 코드에 큰 문제는 아닙니다. 당신의 GridView에 대한 그래서

, 그 결과는 아래와 같습니다 :

<GridView ItemsSource="{x:Bind OrderViewModel.Products, Mode=OneWay}"> 
    <GridView.ItemTemplate> 
     <DataTemplate x:DataType="Models:Product" > 
      <AutoSuggestBox 
       Name="ProductAutoSuggestBox" 
       TextMemberPath="{x:Bind ItemCode, Mode=TwoWay}" 
       TextChanged="{x:Bind FindProduct_TextChanged}"> 
      </AutoSuggestBox> 
     </DataTemplate> 
    </GridView.ItemTemplate> 
</GridView> 
+0

@ Feng - MSFT에 감사드립니다.'FindProduct_TextChanged'가'Products' 클래스에 있어야한다고 말하는 겁니까? 만약 그렇다면 아마도 ObservableCollection Products {get; 세트; } = 새로운 ObservableCollection ();'그리고 나서'x : DataType = "모델 : ProductViewModel"그리고'FindProduct_TextChanged'를'ProductViewModel'에 넣으십시오. 그게 더 나은 접근 방법 같아? – Vague

+0

@Vague, 그렇습니다. 데이터 모델로'ProductViewModel'을 사용하고자한다면, 그렇습니다. 그러나 일반적으로 뷰 모델이 아닌 데이터 모델을 사용해야합니다. –

+0

@ Feng - MSFT에 감사드립니다. 필자는 뷰에 고유 한 기능인 FindProduct_TextChanged라는 기능을 사용하여 모델을 오염시키는 것이 좋지 않다고 생각했습니다. 아니면 내가 잘못 이해 한거야? – Vague

0

오류가 나는 그것에게 문자 집합 지원 버그 승인과 같은 종류의 경우 : 오류 잘못된 바인딩 경로 'XX.YY를': 부동산 'CCC'유형에서 'ZZ'을 (를) 찾을 수 없습니다.

xaml과 C#은 유니 코드를 지원합니다. 클래스 속성에서 ASCII가 아닌 문자를 사용했기 때문입니다. 이것은 오늘 내가 발견 한 버그입니다. 클래스 이름을 ASCII 문자로 바꿉니다. 희망을 고칠 것입니다.

관련 문제