【问题标题】:How to have multiple level of binding with ListViews如何与 ListViews 进行多级绑定
【发布时间】:2016-10-17 00:04:04
【问题描述】:

这是我的问题,我想要一些 ListViews,它们的 ItemsSource 绑定到其他 ListViews 的 SelectedItem。

这是给你看界面的图片,让你可以俯瞰:

所以我有一个“Tours”ListView,它的 ItemSource 与 ObservableCollection 属性绑定。

现在我希望“Parties”ListView 与“Tours”ListView 的 SelectedItem 绑定。

之后,我希望“Équipes”ListView 与“Parties”ListView 的 SelectedItem 绑定。

等等……

现在,它正在运行,但是程序崩溃了:

  1. 从“游览”中选择“游览”
  2. 从“当事人”中选择“当事人”
  3. 从“Équipes”中选择“Équipe”
  4. 从“游览”中选择“不同的“游览”
  5. 崩溃

我想是当我改变“Tour”时,“Équipe”指向不存在的东西。

这是 ListViews 和内容的 XAML(内容现在没有绑定):

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.2*" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <StackPanel>

            <Label Style="{StaticResource menu}" Content="Tours" />
            <ListView Name="lvTours" ItemsSource="{Binding Tours}" SelectionChanged="lvTours_SelectionChanged">
                <ItemsControl.ItemTemplate>

                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>

                </ItemsControl.ItemTemplate>
            </ListView>

            <Label Style="{StaticResource menu}" Content="Parties" />
            <ListView Name="lvParties" DataContext="{Binding RelativeSource={RelativeSource Self}}" SelectionChanged="lvParties_SelectionChanged" >
                <ItemsControl.ItemTemplate>

                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>

                </ItemsControl.ItemTemplate>
            </ListView>

            <Label Style="{StaticResource menu}" Content="Équipes" />
            <ListView Name="lvEquipes" DataContext="{Binding RelativeSource={RelativeSource Self}}">
                <ItemsControl.ItemTemplate>

                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>

                </ItemsControl.ItemTemplate>
            </ListView>
        </StackPanel>

        <Label Content="Here's the content..." Grid.Column="1" Margin="30" />

    </Grid>

这是cs:

using Lama.Logic.Model.Test;
using System.Windows.Controls;

namespace Lama.UI.UC.TournoiControls.StatistiquesControls
{
    /// <summary>
    /// Interaction logic for Statistiques.xaml
    /// </summary>
    public partial class StatistiquesUC : UserControl
    {
        public Tour SelectedTour { get; set; }
        public Partie SelectedPartie { get; set; }

        public StatistiquesUC()
        {
            InitializeComponent();
        }

        private void lvTours_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            lvParties.ItemsSource = ((Tour)lvTours.SelectedItem).Parties;
        }

        private void lvParties_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            lvEquipes.ItemsSource = ((Partie)lvParties.SelectedItem).Equipes;
        }
    }
}

所以:

  • “Tours”是 ObservableCollection 的一个属性
  • 每个“Tour”都有 ObservableCollection 的“Parties”属性
  • 每个“Partie”都有 ObservableCollection 的“Equipes”属性
  • 等等……

感谢和抱歉我的英语!

【问题讨论】:

  • 你的英文不错:)

标签: c# wpf xaml listview data-binding


【解决方案1】:

由于您不想要 ViewModel,这是另一种方法:

在你的 xaml 中不需要 SelectionChanged,只需像这样绑定 Lisview Equipe & Partie 的 itemSource 的父列表视图:

<Grid DataContext="{Binding YourViewModel}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.2*" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <StackPanel>

            <Label Style="{StaticResource menu}" Content="Tours" />
            <ListView Name="lvTours" ItemsSource="{Binding Tours}" >
                <ItemsControl.ItemTemplate>

                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>

                </ItemsControl.ItemTemplate>
            </ListView>

            <Label Style="{StaticResource menu}" Content="Parties" />
            <ListView Name="lvParties" ItemsSource="{Binding ElementName=lvTours, Path=SelectedItem.Parties}" >
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ListView>

            <Label Style="{StaticResource menu}" Content="Équipes" />
            <ListView Name="lvEquipes"  ItemsSource="{Binding ElementName=lvParties, Path=SelectedItem.Equipes}" >
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Nom}" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ListView>
        </StackPanel>

        <Label Content="Here's the content..." Grid.Column="1" Margin="30" />

    </Grid>

希望对你有帮助

【讨论】:

  • 我真的不想使用 Mvvm,因为我迷失在模式中,但我很确定我可以在没有 ViewModel 的情况下适应您的解决方案。让我明天试试,非常感谢!
  • 我只使用了您的答案中的ItemsSource="{Binding ElementName=lvParties, Path=SelectedItem.Equipes}",它可以按我的意愿完美运行!除了InitializeComponent(); 之外,.cs 中不需要任何内容​​。我认为我不应该接受这个答案,因为这对于我自己的目的来说有点矫枉过正。如果您可以编辑它,我会接受它。再次感谢!
  • 现在我正在尝试将那些Label/LisView 放入UserControl,因为我每次都重复代码。所以现在我有 3 个UserControl,称为MenuUC,但我无法设置ItemsSource,因为它位于UserControl 内的一层。我应该发布另一个问题吗?
  • 这就是为什么 MVVM 方法更准确的原因。是的,我认为这是另一个问题。 :)
猜你喜欢
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多