C# 如何从另一个DataContext绑定ComboBox SelectedItem?

C# 如何从另一个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="

我有一个edit
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ć我不是指英语朋友:)我的意思是你说这个对象是属性等,我们不知道你的类结构是什么。我根据一些假设更新了我的答案。如果需要精确的修复,请给你的所有类编码。谢谢:)这是我一直缺少的。