我有以下型号:
public class Profile
{
public string name { get; set; }
public Member casemanager { get; set; }
public Member assistant { get; set; }
}
public class Member
{
public int Id { get; set; }
public int Type{ get; set; }
public string Name { get; set; }
}
在我的ViewModel中,我有以下对象:
- 从数据库填充的名为Profiles的
ObservableCollection<Profile>
- 当然是Profile类型的SelectedProfile
- 从DB填充的两个名为ListCaseManagers和ListAssistants的成员列表
每个对象都实现了Caliburn的NotifyOfPropertyChange
方法。Micro和设置有属性和背景字段。
视图:
<StackPanel>
<ListView ItemsSource="{Binding Profiles}" SelectedItem="{Binding SelectedProfile}" DisplayMemberPath="name" SelectionMode="Single" />
<ComboBox ItemsSource="{Binding ListCaseManagers}" SelectedItem="{Binding SelectedProfile.casemanager }" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
<ComboBox ItemsSource="{Binding ListAssistants}" SelectedItem="{Binding SelectedProfile.assistant}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name"/>
</StackPanel>
在这个XAML中,我认为每个组合框的SelectedItem将直接绑定到SelectedProfile案例管理器/助理,每次我使用ListView修改SelectedProfile时都会发生变化,但它似乎不会选择组合框中的项目,即使SelectedProfile.casemanager和SelectedProfile.assistant不为空。
我错过了什么?有没有一种简单的方法可以使用Caliburn的约定。Micro?
在组合框中显示两个属性,它们可以允许您修改列表中的SelectedItem。
SelectedValuePath="Id" <br/>
SelectedValue="{Binding SelectedProfile.casemanager.Id}"
Upd:这种方法允许通过所选元素的某些唯一属性(ID或名称(绑定所选元素
如果您需要使用SelectedItem。。您必须确保Profiles集合中项目的props与ListCaseManagers和ListAssistants 中的对象相关
var query = from p in Profiles
join mgr in ListCaseManagers on p.casemanager==mgr
select p;
? query.Count
enter code here
我想你会看到0..,因为集合中的对象不同。
要使用Caliburn的约定名称,您必须为您的控制命名
例如ListView:
<StackPanel>
<ListView x:Name ="Profiles" />
</StackPanel>
通过名称约定,Caliburn自动绑定集合Profiles,并将SelectedProfiles用作SelectedItem
当SelectedProfile
属性被设置时,您需要为其引发PropertyChanged
:
private Profile_selectedProfile;
public ProfileSelectedProfile
{
get { return _selectedProfile; }
set
{
_selectedProfile = value;
NotifyOfPropertyChange(() => SelectedProfile);
}
}
或者您可以绑定到ListView
控件本身的SelectedItem
属性:
<StackPanel>
<ListView x:Name="lv" ItemsSource="{Binding Profiles}"
SelectedItem="{Binding SelectedProfile}"
DisplayMemberPath="name" SelectionMode="Single" />
<ComboBox ItemsSource="{Binding ListCaseManagers}"
SelectedItem="{Binding SelectedItem.casemanager, ElementName=lv }"
DisplayMemberPath="Name"/>
<ComboBox ItemsSource="{Binding ListAssistants}"
SelectedItem="{Binding SelectedItem.assistant, ElementName=lv}"
DisplayMemberPath="Name"/>
</StackPanel>