WPF:将嵌套ListBox的SelectedItem绑定到属性C#

时间:2017-05-25 19:34:42

标签: c# wpf mvvm data-binding

我有主DataTemplate ListBox,其中包含SelectedItem = SelectedSession 我还有一个嵌套的ListBox,其中包含SelectedItem = AssignedExercises 如果我将属性绑定到两个选定的项目,我无法获得嵌套的ListBoxe的项目AssignedExercises。

您是否知道如何访问嵌套的ListBoxes SelectedItem(AssignedExercises)并将其绑定到属性?

XAML代码:

<ListBox Grid.Row="1" ItemsSource="{Binding SessionList}" SelectedItem="{Binding SelectedSession}" Margin="0,0,0,20">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Border CornerRadius="2" BorderBrush="Black" BorderThickness="2" Width="1000" Height="200" Margin="1">
            <Grid>

                <Label Content="List of exercises" RenderTransformOrigin="0.5,0.5" Height="30" VerticalAlignment="Top" FontWeight="Bold"></Label>

                <ListBox Height="150" Width="325" ItemsSource="{Binding AssignedExercises}" SelectedItem="{Binding AssignedExercises}">

                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Border Height="50" Width="300" BorderBrush="LightGray" BorderThickness="2" CornerRadius="2" Margin="0,1,0,1">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="40"/>
                                    </Grid.RowDefinitions>
                                    <StackPanel Grid.Row="0" Margin="5,0,5,0" VerticalAlignment="Center" HorizontalAlignment="Center" Orientation="Horizontal">
                                        <Label Content="{Binding Name}" FontSize="14" FontWeight="Bold"/>
                                    </StackPanel>
                                </Grid>
                            </Border>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

            </Grid>
        </Border>
    </DataTemplate>
</ListBox.ItemTemplate>

属性:

private TrainingSessionVM selectedSession;
private ExerciseVM selectedExercise;
public TrainingSessionVM SelectedSession
{
    get { return selectedSession; }
    set
    {
        selectedSession = value;
        RaisePropertyChanged();
    }
}
public ExerciseVM SelectedExercise
{
    get { return selectedExercise; }
    set
    {
        selectedExercise = value;
        RaisePropertyChanged();
    }
}

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则会有一个Session列表,其中每个列表都包含Exercise列表。这些中的每一个都可以被视为视图模型。

您的主视图模型有一个SelectedSession来指示选择了哪个Session。您只需在Session内执行相同的操作(不是示例中的主视图模型)。将SelectedExercise添加到Session,并将内部SelectedItem的{​​{1}}绑定到其中。

然后,您可以使用ListBox从主视图模型访问内部选定的Exercise

答案 1 :(得分:0)

在这里,我找到了如何通过DataContext绑定直接绑定它的解决方案:

SelectedItem="{Binding DataContext.SelectedExercise, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"

但是在这种情况下,应该以这种方式绑定到View Model:

<Grid.DataContext>
    <Binding Source="{StaticResource Locator}" Mode="OneWay" Path="TrainingSessionMain"/>
</Grid.DataContext>

参与的Thx。