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

Object Binding in Caliburn.Micro MVVM Framework with SelectedItem

我有以下型号:

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 中,我有以下对象:

每个对象都实现了 Caliburn.Micro 中的 NotifyOfPropertyChange 方法,并设置了 属性 和支持字段。

视图:

<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 中,我认为每个 ComboBox 的 SelectedItem 会直接绑定到 SelectedProfile casemanager/assistant,每次我使用 ListView 修改 SelectedProfile 时都会改变,但它似乎并没有select 组合框中的项目,即使 SelectedProfile.casemanager 和 SelectedProfile.assistant 不为空。

我错过了什么?有没有一种使用约定的简单方法 Caliburn.Micro?

在组合框中显示几个属性,可以让您修改列表中的 SelectedItem。

SelectedValuePath="Id" <br/>
SelectedValue="{Binding SelectedProfile.casemanager.Id}"

Upd:此方法允许通过某些唯一属性(ID 或名称)绑定选定元素

如果您需要使用 SelectedItem.. 您必须确保 Profiles 集合中项目的道具与 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>