2016-11-17 76 views
1

使用模板10的UWP中的訂單窗體將產品添加到訂單中。該錯誤是在UWP應用程序中的ViewModel上找不到屬性

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

相關的XAML代碼段是

<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> 

從OrderViewModel和ProductViewModel

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() 
     { 
     } 
    } 
} 

相關片段如何以正確的OrderViewModel參考FindProduct_TextChanged從GridView的DataTemplate參考ProductViewModel

+2

您使用'OrderViewModel.Products'作爲ItemsSource,這意味着'x:DataType'必須是'Product'並且'FindProduct_TextChanged'方法必須放入它。 – tao

+0

謝謝@tao。我不太清楚你的意思。 'Product'不是'OrderViewModel'的成員,但'Products'是'OrderViewModel'的成員。 'FindProduct_TextChanged'更新'OrderViewModel.Products',所以我看不到如何將它放在除OrderViewModel之外的任何地方。或者我誤解了?你能提供一個代碼片段來說明你的意思嗎? – Vague

回答

3

投了最多@陶的評論。 @Vague,我想你可能會誤解x:DataType的用途。可以參考「的DataTemplate×:數據類型」的Data binding in depth部分:

當使用:在一個數據模板{X綁定},使得其綁定可以被驗證(併爲他們產生的有效的代碼)在編譯時,DataTemplate需要使用x:DataType來聲明其數據對象的類型。

您的方案,從您的代碼public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();,你DataTemplate的數據對象的類型應該是你Product類,而不是你的ProductViewModel,而在此期間,您FindProduct_TextChanged事件必須在此Product類中發現,這意味着您的代碼FindProduct_TextChanged應該放置在您的Product數據模型中。

順便說一句,我認爲沒有必要使用TwoWay綁定ItemsSource。對於這種情況,綁定目標是ItemsSourceGridView,綁定來源是ObservableCollection<Product> Products,我知道您想在更新收藏時更新GridView,這是使用ObservableCollection完成的工作。另外,這裏只有綁定源可以改變來通知綁定目標,所以綁定就足夠了。但它不是你的代碼的大問題。

因此,對於你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

謝謝@Grace Feng - MSFT。你在說'FindProduct_TextChanged'應該在'Products'類嗎?如果是這樣,也許我應該有'ObservableCollection Products {get;組; } = new ObservableCollection ();'然後'x:DataType =「Models:ProductViewModel」並在'ProductViewModel'上放置FindProduct_TextChanged。這聽起來像是一個更好的方法? ' – Vague

+0

@Vague,是的,如果你堅持使用'ProductViewModel'作爲你的數據模型,那麼你是對的。但通常我們需要在這裏使用數據模型,而不是視圖模型。 –

+0

謝謝@Grace Feng - MSFT。我認爲這不是好的做法,因爲這是特定於視圖的功能「FindProduct_TextChanged」污染模型。或者我誤解了? – Vague

0

如果誤差是那種喜歡我批准了一個字符集支持錯誤: 錯誤無效的綁定路徑「XX.YY」:房產'CZ'上找不到'ZZ'

xaml和C#都支持unicode; 其原因是因爲您在類屬性中使用了非ascii字符。這是我今天發現的一個錯誤。只需將您的課程特色字符重命名爲ascii標準即可。希望它會被修復。

相關問題