UWP ListView将SelectedItem绑定到viewmodel中的属性

我试图将ListView中的SelectedItem绑定到viewmodel中的SelectedSection属性。 我收到以下错误:“无效的绑定路径'ViewModel.SelectedSection':无法将类型'Model.Section'绑定到'System.Object'而没有转换器”。 我目前将ListView的ItemSource绑定到CurrentProject属性中的列表。 我尝试制作一个转换器,但我不太确定我想转换的方式和方式。 当我尝试使用SelectedValue和SelectedValuePath获取需要的属性时,我得到了相同的错误。

<ListView Name="SectionsListView"
                IsItemClickEnabled="True"
                ItemsSource="{x:Bind ViewModel.CurrentProject.Sections, Mode=OneWay}"
                SelectedItem="{x:Bind ViewModel.SelectedSection, Mode=TwoWay}">

视图模型:

 private Section selectedSection = new Section();
 public Section SelectedSection
 {
     get { return selectedSection; }
     set { selectedSection = value; OnPropertyChanged(nameof(SelectedSection)); }
 }

 private Project currentProject;
 public Project CurrentProject
 {
     get { return currentProject; }
     set { currentProject = value; OnPropertyChanged(nameof(CurrentProject)); }
 }

转换器:

 public object Convert(object value, Type targetType, object parameter, string language)
 {
     return value;
 }
 public object ConvertBack(object value, Type targetType, object parameter, string language)
 {
     return value as Section;
 }

如果使用传统的{Bindings}标记实现了这一点,则不会出现此问题,因为绑定是在运行时计算的,而{x:Bind}是在编译时计算的。

这里的情况是,ItemsSource和SelectedItem都是Object类型的属性,因此当Target尝试更新Source时会出现问题,因为您无法将Object类型的属性分配给您的(ViewModel.SelectedSection)属性。 相反,不会抛出任何错误,因为您的ViewModel.SelectedSection属性可隐式转换为对象。

x:Bind的一个特点是你可以投射你的属性,例如:

{x:Bind (x:Boolean)CheckBox.IsChecked, Mode=TwoWay}"

问题在于,由于在你的情况下,我们没有处理一种XAML内部数据类型,所以你必须将你的ViewModel类映射到你的XAML名称空间,方法是将它包含在页面根目录定义的XML名称空间中。

xmlns:myviewmodel="using:......"

包含它后,我认为你可以成功地将它转换为所需的引用类型,而不会出现任何编译错误,方法是执行如下所示的转换:

<ListView Name="SectionsListView"
                IsItemClickEnabled="True"
                ItemsSource="{x:Bind ViewModel.CurrentProject.Sections, Mode=OneWay}"
                SelectedItem="{x:Bind (myviewmodel:ViewModel) ViewModel.SelectedSection, Mode=TwoWay}">

或者您可以对代码进行一些调整,并使用{Binding},这实际上只是简化了整个过程!


感谢您的回应,我通过将datacontext设置为viewmodel并使用常规绑定来解决问题。

<ListView Name="SectionsListView"
          DataContext="{x:Bind ViewModel}"
          ItemsSource="{Binding CurrentProject.Sections, Mode=OneWay}"
          SelectedItem="{Binding SelectedSection, Mode=TwoWay}">
链接地址: http://www.djcxy.com/p/7767.html

上一篇: UWP ListView bind SelectedItem to property in viewmodel

下一篇: binding text on radiobutton selection