c# – UWP – x:绑定模式= TwoWay抛出没有转换器的错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – UWP – x:绑定模式= TwoWay抛出没有转换器的错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2611字,纯文字阅读大概需要4分钟。
内容图文
![c# – UWP – x:绑定模式= TwoWay抛出没有转换器的错误](/upload/InfoBanner/zyjiaocheng/805/b693358bfefe488e993bd3266f82c9a8.jpg)
对此有类似的问题,但答案似乎与原始问题不符.
我有一个DataTemplate,里面有3个组合框.前两个工作正常,但第三个抛出编译器错误.
<ComboBox ItemsSource="{x:Bind ListOne, Mode=OneWay}"
SelectedItem="{Binding SelectedOne, Mode=TwoWay}"
DisplayMemberPath="Name"/>
<ComboBox ItemsSource="{x:Bind ListTwo}"
SelectedItem="{x:Bind SelectedTwo, Mode=TwoWay, Converter={StaticResource GenericConverter}}"
DisplayMemberPath="Name"/>
<ComboBox ItemsSource="{x:Bind ListThree}"
SelectedItem="{x:Bind SelectedThree, Mode=TwoWay}"
DisplayMemberPath="Name"/>
对于ListOne,“绑定”工作原理完美.
对于ListTwo,“x:Bind”仅在添加值转换器时有效. “GenericConverter”只返回传入的“值”.除此之外,它什么都不做.
对于没有值转换器的ListThree,编译器会抛出错误:
“Invalid binding path ‘SelectedThree’: Cannot bind type ‘IdNameVm’ to
‘SystemObject’ without a converter.
在所有情况下,ItemSource都是ObservableCollection,所选项的类型为IdNameVm.
使用转换器工作,但是被迫在x上放置一个虚拟转换器感觉不对:绑定只是为了让XAML进行编译.
根据要求,以下是ObservableCollection的定义方式以及IdNameVm:
public ObservableCollection<IdNameVm> ListOne { get; set; }
public class IdNameVm : BindableBase
{
private int _id;
private string _name;
public int Id
{
get { return _id; }
set { Set(ref _id, value); }
}
public string Name
{
get { return _name; }
set { Set(ref _name, value); }
}
protected bool Equals(IdNameVm other)
{
return Id == other.Id;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((IdNameVm)obj);
}
public override int GetHashCode()
{
unchecked
{
var hashCode = Id;
return hashCode;
}
}
}
解决方法:
如果您查看ComboBox的文档,您将看到ItemsSource和SelectedItem属性都是类型对象.控件运行时不知道它正在处理哪种类型的视图模型.所以你基本上可以将任何类型的集合传递给ItemsSource.并且SelectedItem在不知道它正在处理什么类型的对象的情况下工作.
这种行为适用于传统的双向{Binding},因为在运行时评估绑定.所以{Binding}可以在运行时将SelectItem的对象类型转换为IdNameVm.
但是,{x:Bind}的情况有点不同.正如您已经注意到单向绑定有效 – 这是因为您的ObservableCollection可以隐式转换为object(ItemsSource的类型)和IdNameVm转换为object(SelectedItem的类型).但是双向绑定将不再起作用,因为编译器无法将对象(SelectedItem的类型)强制转换为IdNameVm.你需要一个转换器.
这就像你可以在C#中做到这一点:
IdNameVm vm = new IdNameVm();
object selectedItem = vm;
但你做不到:
IdNameVm vm = new IdNameVm();
object selectedItem = vm;
IdNameVm vm2 = selectedItem; // You need: IdNameVm vm2 = (IdNameVm)selectedItem;
评论中的演员阵容是XAML中的转换器.
最简单的方法是在这些情况下使用传统的{Binding}.
内容总结
以上是互联网集市为您收集整理的c# – UWP – x:绑定模式= TwoWay抛出没有转换器的错误全部内容,希望文章能够帮你解决c# – UWP – x:绑定模式= TwoWay抛出没有转换器的错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。