Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:将嵌套ListBox的SelectedItem绑定到属性C#_C#_Wpf_Mvvm_Data Binding - Fatal编程技术网

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

WPF:将嵌套ListBox的SelectedItem绑定到属性C#,c#,wpf,mvvm,data-binding,C#,Wpf,Mvvm,Data Binding,我有一个主数据模板列表框,它有SelectedItem=SelectedSession 我还有一个嵌套的列表框,它有SelectedItem=AssignedExercises 如果将属性绑定到两个选定项,则无法获取嵌套ListBoxe的项AssignedExercises 您知道如何访问嵌套列表框SelectedItem(AssignedExercises)并将其绑定到属性吗 XAML代码: <ListBox Grid.Row="1" ItemsSource="{Binding Sess

我有一个主数据模板列表框,它有SelectedItem=SelectedSession 我还有一个嵌套的列表框,它有SelectedItem=AssignedExercises 如果将属性绑定到两个选定项,则无法获取嵌套ListBoxe的项AssignedExercises

您知道如何访问嵌套列表框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>

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

您的主视图模型有一个
SelectedSession
,指示选择了哪个
Session
。您只需要在
会话
中执行相同的操作(与示例中的主视图模型不同)。将
SelectedExercise
添加到
Session
,并将内部
列表框的
SelectedItem
绑定到它


然后,您可以使用
SelectedSession从主视图模型访问内部选中的
练习
。SelectedExercise

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

SelectedItem="{Binding DataContext.SelectedExercise, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"
但在这种情况下,绑定到视图模型的方式应为:

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


Thx表示参与。

Thx表示答案。两个绑定都位于TrainingSessionMainVM中。如果我添加SelectedItem=“{Binding SelectedSession.AssignedExercises}”,则不会发生任何事情。属性没有任何价值。对,我是说你应该改变它。将
SelectedExercise
属性移动到
TrainingSessionVM
。您可以轻松地以这种方式绑定到它,并且仍然可以从外部viewmodel访问它。您在内部列表框上的绑定看起来像
{binding Path=SelectedExercise}
,该属性将位于不同的对象上。该属性已经存在,并且从一开始就存在。如果SelectedExercise的选定项与SelectedSession绑定,我也无法访问它。SelectedExercise或SelectedExercise。示例代码显示,
SelectedExercise
属性是主视图模型的成员,而不是
TrainingSessionVM
。嘿!我很抱歉看到你删除了你的问题,我只是想提供有用的反馈来改进它。我会在你确认阅读后删除我的评论,这是关于你的反思问题(你没有20个代表,所以我无法与你聊天)。检查并让我知道这是否是你想要的!在您确认后,我将删除这2条评论:)@AlexC。谢谢你的尝试。你的代码和我的代码一样。因为我没有透露全部代码。但我需要操作运行WinForm应用程序的不同方法。oh=Activator.CreateInstanceFrom(可执行文件,类型);Application.Run((表单)oh.Unwrap());我是这样做的,正如你所看到的,已启动应用程序的实例被分离为单独的线程,更多的是它只适用于未包装的表单。但我需要在运行时完全控制任何方法来运行应用程序。
<Grid.DataContext>
    <Binding Source="{StaticResource Locator}" Mode="OneWay" Path="TrainingSessionMain"/>
</Grid.DataContext>