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 中,我有以下对象:
- 从数据库中填充的
ObservableCollection<Profile>
命名配置文件;
- 当然是配置文件类型的 SelectedProfile;
- 从数据库中填充的名为 ListCaseManagers 和 ListAssistants 的两个成员列表。
每个对象都实现了 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>
我有以下型号:
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 中,我有以下对象:
- 从数据库中填充的
ObservableCollection<Profile>
命名配置文件; - 当然是配置文件类型的 SelectedProfile;
- 从数据库中填充的名为 ListCaseManagers 和 ListAssistants 的两个成员列表。
每个对象都实现了 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>