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