在UWP应用中的ViewModel上找不到属性

时间:2016-11-17 06:56:06

标签: xaml uwp uwp-xaml template10

使用模板10的UWP中的订单表单将产品添加到订单中。错误是

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

如何在引用FindProduct_TextChanged的GridView的DataTemplate中OrderViewModel正确引用ProductViewModel

2 个答案:

答案 0 :(得分:3)

投票至@tao的评论。 @Vague,我想你可能会误解x:DataType的用途。您可以参考Data binding in depth的“DataTemplate和x:DataType”部分:

  

在数据模板中使用{x:Bind}时,可以在编译时验证其绑定(以及为它们生成有效的代码),DataTemplate需要使用x:DataType声明其数据对象的类型。

对于您的方案,从您的代码public ObservableCollection<Product> Products { get; set; } = new ObservableCollection<Product>();开始,DataTemplate的数据对象的类型应该是您的Product类,而不是您的ProductViewModel,并且同时,您必须在此FindProduct_TextChanged课程中找到Product个活动,这意味着您的FindProduct_TextChanged代码应放在Product数据模型中。

顺便说一句,我认为没有必要对TwoWay使用ItemsSource绑定。对于这种情况,绑定目标是ItemsSource GridView,绑定源是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>

答案 1 :(得分:0)

如果错误是这样的,我批准了它的charset支持错误: 错误无效的绑定路径&#39; XX.YY&#39; :物业&#39; ZZ&#39;无法在类型&#39; CCC&#39;

上找到

xaml和C#都支持unicode; 因为你在类属性中使用非ascii字符。这是我今天发现的一个错误。只需将您的类proprty字符重命名为ascii标准。希望它能得到解决。