【问题标题】:UWP ListView bind SelectedItem to property in viewmodelUWP ListView 将 SelectedItem 绑定到视图模型中的属性
【发布时间】:2018-05-25 05:55:39
【问题描述】:

我正在尝试将 ListView 中的 SelectedItem 绑定到视图模型中的属性 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;
 }

【问题讨论】:

    标签: c# binding uwp selecteditem ivalueconverter


    【解决方案1】:

    如果您使用传统的 {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 },老实说,这完全简化了这个过程!

    【讨论】:

      【解决方案2】:

      感谢您的回复,我通过将数据上下文设置为视图模型并改用常规绑定来实现它。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-22
        • 2010-12-02
        • 2023-03-20
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多