Caliburn中的对象绑定.带SelectedItem的Micro MVVM框架



我有以下型号:

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>

最新更新