为何AutoMapper会将绑定属性用作源?WPF应用技术咨询
解决AutoMapper在WPF中试图映射绑定控件的问题
嘿,刚上手AutoMapper碰到这种坑太正常了!我来帮你拆解下可能的原因和解决办法:
最可能的原因:你传给AutoMapper的源对象是UI控件,不是ViewModel数据
AutoMapper只会映射你传入对象的属性,如果你不小心把ListBox的控件实例或者ItemTemplate里的UI元素传给了Map()方法,它自然会去尝试映射控件的各种属性(比如Width、Visibility这些),这肯定不是你想要的。
怎么排查?
- 先检查你的数据绑定:确保ListBox的
ItemsSource绑定的是ViewModel里的数据集合(比如ObservableCollection<YourDataModel>),而不是控件集合。 - 再确认
SelectedItem绑定的是ViewModel里的数据对象属性(比如YourDataModel SelectedItem { get; set; }),而不是控件类型的属性。如果SelectedItem绑定错了,你拿到的就是UI控件实例,传给AutoMapper就会出问题。
检查AutoMapper的配置是否正确
如果你已经确认传入的是数据对象,但还是出现这个问题,可能是配置时没明确指定源和目标类型,或者没忽略掉ViewModel里可能存在的控件属性:
1. 确保配置了正确的映射关系
比如你的源是数据模型YourDataModel,目标是ViewModelYourViewModel,配置应该是这样的:
var config = new MapperConfiguration(cfg => { cfg.CreateMap<YourDataModel, YourViewModel>(); }); var mapper = config.CreateMapper();
2. 忽略不需要映射的控件相关属性
如果你的ViewModel里不小心有控件类型的属性(比如为了绑定UI元素加的TextBox MyTextBox { get; set; }),记得在配置里忽略它:
cfg.CreateMap<SourceType, DestType>() .ForMember(dest => dest.MyTextBox, opt => opt.Ignore());
正确的调用示例
假设你的ViewModel里有选中的数据对象SelectedItem,调用AutoMapper应该是这样的:
// 这里的SelectedItem是YourDataModel类型,不是控件 var clonedViewModel = mapper.Map<YourViewModel>(SelectedItem);
额外提醒:按钮状态的绑定
顺便提一句,你说的按钮状态切换(未选中时仅Add可用,选中时全可用),建议用命令的CanExecute来实现,比如用RelayCommand(或者Prism的DelegateCommand),在SelectedItem变化时触发RaiseCanExecuteChanged(),这样比手动控制按钮IsEnabled更符合MVVM规范哦。
内容的提问来源于stack exchange,提问作者DMK
相关产品推荐
相关产品推荐

