C# 如何从另一个DataContext绑定ComboBox SelectedItem?
我有一个editC# 如何从另一个DataContext绑定ComboBox SelectedItem?,c#,wpf,mvvm,combobox,C#,Wpf,Mvvm,Combobox,我有一个editusercontrol,用于编辑训练详细信息。 在该UC上有一个组合框,其datacontext设置为运动设备的另一个viewmodel。打开uc后如何获取选定项目获取训练属性 代码如下: <ComboBox Name="ExeEquComboBox" ItemsSource="{Binding AllExerciseEquipment}" DisplayMemberPath="Name" SelectedValue="
usercontrol
,用于编辑训练详细信息。
在该UC上有一个组合框,其datacontext设置为运动设备的另一个viewmodel。打开uc后如何获取选定项目获取训练属性
代码如下:
<ComboBox Name="ExeEquComboBox"
ItemsSource="{Binding AllExerciseEquipment}"
DisplayMemberPath="Name"
SelectedValue="{Binding ExerciseEquipment, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Mode=TwoWay}">
<ComboBox.DataContext>
<ExerciseEquipmentViewModel/>
</ComboBox.DataContext>
</ComboBox>
编辑:按要求发布更多详细信息:
训练属性包括:
名称
描述
IdExerciseEquipment(ExerciseEquipment表的外键)
我有两个ViewModels:
工作视图模型
练习设备视图模型
当我打开UC时,我将训练对象传递给它,并将usercontrol的datacontext设置为该对象
在该UC上有一个组合框,其datacontext设置为ExerciseEquipmentViewModel。
我从该视图模型中获取itemsource
我需要的是将Workout.idexercisequipment正确绑定到Combobox itemsource。打开UserControl时,请选择Combobox.SelectedItem
应该是健身器材,但我不知道如何做到
谢谢。有两种方法可以做到这一点:
祖先绑定
就像您所做的那样。只需按如下方式更正binidng
:
SelectedValue="{Binding DataContext.ExerciseEquipment, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}"
ComboBox Name="ExeEquComboBox"
ItemsSource="{Binding AllExerciseEquipment}"
DisplayMemberPath="Name"
SelectedValue="{Binding ElementName=UserControlName,Path=DataContext.ExerciseEquipment}">
元素绑定
,如下所示:
SelectedValue="{Binding DataContext.ExerciseEquipment, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}"
ComboBox Name="ExeEquComboBox"
ItemsSource="{Binding AllExerciseEquipment}"
DisplayMemberPath="Name"
SelectedValue="{Binding ElementName=UserControlName,Path=DataContext.ExerciseEquipment}">
更新:根据您提供的信息,我能够理解在Workout
对象中有idexercisequipment
属性,我认为这是用于区分allexercisequipment
项目的某种ID。我认为您应该在训练
课程中创建以下属性:
private string exerciseEquipment;
public string ExerciseEquipment
{
get
{
if (exerciseEquipment == null)
{
exerciseEquipment = AllExerciseEquipment.FirstOrDefault(x => x.ID == this.IdExerciseEquipment);
}
return exerciseEquipment;
}
set
{
exerciseEquipment = value;
}
}
因此,默认情况下,当练习设备
为空时,我们通过迭代组合框
的项目源
,为匹配ID
的项目设置一个值
由于我没有您精确的类定义,请在需要的地方更改代码。发布更多代码并更具体一些。我已经厌倦了您的两种解决方案,它们都可以工作。但是,在打开UserControl时,组合框中没有选择任何内容。如何让combox显示训练中具有id的锻炼设备。IdExerciseEquipment?@MarkoDragičević您的语言水平很高,我看不到您的问题。据我所知,训练是ViewModel&IdExerciseEquipment是ViewModel的一个属性。我说得对吗?这项锻炼。IdExerciseEquipment与您的用户控件有任何关系吗?抱歉,英语不是我的母语:(是的,锻炼是ViewModel&IdExerciseEquipment是view model的属性。问题是,当我打开UserControl时,组合框selectedItem应该“跳转”到锻炼的锻炼设备。例如,我有一个我要编辑的“Bench Press”训练。它有属性名称:“Bench Press”,描述:“lorem Ipsum”,IdEquipment:17。当我打开UC时,组合框应该显示练习设备。名称:“Bench”,但SelectedItem当前为空。如果我从组合框列表中选择某个内容,则绑定有效。@MarkoDragičević我不是指英语朋友:)我的意思是你说这个对象是属性等,我们不知道你的类结构是什么。我根据一些假设更新了我的答案。如果需要精确的修复,请给你的所有类编码。谢谢:)这是我一直缺少的。