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

时间:2016-02-22 09:17:38

标签: c# wpf mvvm combobox

我有一个编辑usercontrol,用于编辑锻炼详细信息。 在该UC上有一个combobox,其datacontext设置为另一个运动设备的视图模型。如何打开uc到选定的项目到达Workout的属性。

以下是代码:

<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表的外键)。

我有2个ViewModel: WorkoutViewModel ExerciseEquipmentViewModel

当我打开UC时,我将Workout对象传递给它,并将usercontrol的datacontext设置为该对象。

在该UC上有一个组合框,其datacontext设置为ExerciseEquipmentViewModel。 我从该viewmodel获取了itemsource。

我需要的是将Workout.IdExerciseEquipment正确绑定到Combobox项目源。打开UserControl时,Combobox.SelectedItem 应该是Workout.IdExerciseEquipment的项目,但我不知道如何实现。

感谢。

1 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点:

Ancestor Binding和你一样。只需更正binidng,如下所示:

SelectedValue="{Binding DataContext.ExerciseEquipment, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}"

Element Binding,如下所示:

ComboBox Name="ExeEquComboBox" 
    ItemsSource="{Binding AllExerciseEquipment}" 
    DisplayMemberPath="Name" 
    SelectedValue="{Binding ElementName=UserControlName,Path=DataContext.ExerciseEquipment}">

更新:根据您提供的信息,我能够理解IdExerciseEquipment对象中有Workout属性,我认为这是区分的某种ID AllExerciseEquipment个项目。我认为您应该在Workout class:

中创建如下所示的属性
private string exerciseEquipment;

    public string ExerciseEquipment
    {
        get 
        {
            if (exerciseEquipment == null)
            {
                exerciseEquipment = AllExerciseEquipment.FirstOrDefault(x => x.ID == this.IdExerciseEquipment);
            }
            return exerciseEquipment;
        }
        set 
        { 
            exerciseEquipment = value; 
        }
    }

因此,默认情况下,当ExerciseEquipment为空时,我们会为ID匹配的项目设置一个值,方法是迭代AllExerciseEquipment ItemSource ComboBox }}。

由于我没有确切的类定义,请在需要时更改代码。