WPF:将嵌套ListBox的SelectedItem绑定到属性C#
我有一个主数据模板列表框,它有SelectedItem=SelectedSession 我还有一个嵌套的列表框,它有SelectedItem=AssignedExercises 如果将属性绑定到两个选定项,则无法获取嵌套ListBoxe的项AssignedExercises 您知道如何访问嵌套列表框SelectedItem(AssignedExercises)并将其绑定到属性吗 XAML代码: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
<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>