在 Mode = TwoWay 中绑定 itemSource ListView

Binding itemSource ListView in Mode = TwoWay

抱歉我的英语不好。我试图在列表视图的项目源中绑定图像列表:

ItemsSource="{x:Bind ViewModel.Images,Mode=TwoWay}"

In ViewModel I have a list of Images :

     public List<Image> Images
    {
        get { return _images; }
        set
        {
            _images = value;
            base.RaisePropertyChanged();
        }
    }

绑定模式设置为 TwoWay 时,出现以下错误:

Invalid binding path 'View Model.Reports': You can not associate the type 'System.Collections.Generic.List (posytron.epart.uwp.Models.DOM.Report)' to 'System.Object' without a converter

如果我将绑定模式设置为 OneWay 就可以了!

我已经开发了一个转换器来将布尔值转换为可见性属性。

转换器应该包含什么?有人能帮我吗?为什么我会出现这个错误?

谢谢!!

我没有使用 Tempalte 10,只是使用普通的 UWP 应用程序来测试您的问题,我想我已经重现了您的问题。

由于模板10的型号不同,错误信息可能略有不同,但我认为错误是一样的。

If I set binding mode to OneWay it works!

如果你使用{x:Bind}的OneWay模式,你的ListViewItemSource是绑定目标,你的ViewModel中的List<Image> Images是绑定源。很明显,您的来源是 Image 控件的列表。 ItemSource的类型是System.Object,这里的绑定源是一个Image控件类型的List。默认情况下,数据项在 ListView 中显示为其绑定到的数据对象的字符串表示形式。所以当xaml无法识别这个字符串时,它会直接使用ToString方法的实现来return类型名称并显示在项目上。总之,ItemSource作为绑定目标完成了类型转换的工作。

但是使用TwoWay模式时,ItemSource既是绑定目标也是绑定源,List<Image> Images也是。它在模式 "ItemSource = binding target" 中运行良好,原因我已经在上面解释过,但是如果 "ItemSource = binding source",它不会自动将 System.Object 类型转换为您的列表类型。你也可以说,你没有提供转换器到转换器 System.Object 类型到你需要的类型。

但我认为您在这里不需要 TwoWay 绑定。 TwoWay binding 在目标或源对象发生变化时更新其中之一。创建绑定后,目标 属性 从源更新。从您的代码中,我看不到您可以更改项目中的图像控件来更新源列表。如果你只是想动态添加或删除或编辑ListView中的项目,你可以在这里使用OneWay模式并在后面的代码中更改List。