UWP ListView将SelectedItem绑定到viewmodel

时间:2017-12-11 16:45:42

标签: c# binding uwp selecteditem ivalueconverter

我试图将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;
 }

2 个答案:

答案 0 :(得分:0)

如果您使用传统的 {Bindings} 标记实现了此功能,那么您就不会遇到此问题,因为绑定是在运行时进行评估的,而 {x:Bind} < / strong>在编译时进行评估。

这里的情况是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},这实际上只是简化了这个过程!

答案 1 :(得分:0)

感谢您的回复,我通过将datacontext设置为viewmodel并使用常规绑定来实现它。

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