我有一个似乎没有更新SelectedItem/SelectedValue的ComboBox.
组合框ItemsSource绑定到上列出一串RAS电话簿条目作为一个的CollectionView的视图模型类的属性.然后,我必然(在不同的时间)两个SelectedItem
或SelectedValue
到视图模型的另一个属性.我在save命令中添加了一个MessageBox来调试数据绑定设置的值,但是没有设置SelectedItem
/ SelectedValue
binding.
ViewModel类看起来像这样:
public ConnectionViewModel
{
private readonly CollectionView _phonebookEntries;
private string _phonebookeEntry;
public CollectionView PhonebookEntries
{
get { return _phonebookEntries; }
}
public string PhonebookEntry
{
get { return _phonebookEntry; }
set
{
if (_phonebookEntry == value) return;
_phonebookEntry = value;
OnPropertyChanged("PhonebookEntry");
}
}
}
Run Code Online (Sandbox Code Playgroud)
_phonebookEntries集合正在构造函数中从业务对象初始化.ComboBox XAML看起来像这样:
<ComboBox ItemsSource="{Binding Path=PhonebookEntries}"
DisplayMemberPath="Name"
SelectedValuePath="Name"
SelectedValue="{Binding Path=PhonebookEntry}" />
Run Code Online (Sandbox Code Playgroud)
我只在下拉列表中显示的实际字符串值感兴趣的对象,因为这不是任何其他属性是我需要跨到RAS通过时,我想使VPN连接,因此价值DisplayMemberPath
和SelectedValuePath
都的名称属性ConnectionViewModel.ComboBox DataTemplate
应用于ItemsControl
一个Window,其DataContext已设置为ViewModel实例.
ComboBox正确显示项目列表,我可以在UI中选择一个没有问题.但是,当我从命令中显示消息框时,PhonebookEntry属性仍然具有初始值,而不是ComboBox中的选定值.其他TextBox实例正在更新并在MessageBox中显示.
使用数据绑定ComboBox我错过了什么?我做了很多搜索,似乎找不到任何我做错的事.
这是我所看到的行为,但是在我的特定情况下,它不能用于某种原因.
我有一个MainWindowViewModel,它有一个CollectionView
ConnectionViewModel.在MainWindowView.xaml文件代码隐藏中,我将DataContext设置为MainWindowViewModel.MainWindowView.xaml ItemsControl …
这不是一个问题,因为我找到了一种方法来做我想做的事情,但似乎应该有更好的方法来做到这一点.我到处搜索,没找到任何东西.
基本上,我有我认为非常标准的对象模型.
public class Parent
{
private readonly IList<Child> _children = new List<Child>();
public IEnumerable<Child> Children { get { return _children; } }
public void AddChild(Child child)
{
child.Parent = this;
_children.Add(child);
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Child
{
public Parent Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
(为了清楚起见,我省略了与问题无关的属性以及错误检查和保护......)
public class ParentDTO
{
List<ChildDTO> Children = new List<ChildDTO>();
}
Run Code Online (Sandbox Code Playgroud)
和
public class ChildDTO
{
}
Run Code Online (Sandbox Code Playgroud)
我使用方法将子项添加到集合的原因是为了保持对添加子项时需要处理的业务逻辑的控制.
使用标准映射:
Mapper.CreateMap<Parent, ParentDTO>();
Mapper.CreateMap<ParentDTO, Parent>();
Mapper.CreateMap<Child, ChildDTO>();
Mapper.CreateMap<ChildDTO, Child>();
Run Code Online (Sandbox Code Playgroud)
它似乎从服务层工作得很好.域对象的子项完美映射到ChildDTO
实例列表.
但是,当以相反的方式映射时,域模型上的集合未设置 - 因为它显然是只读的.似乎没有任何方法可以使用AutoMapper直接设置私有字段.我已经尝试了在这里和互联网的其他部分找到的各种建议. …