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