C# 如何将对象列表绑定到列表框

C# 如何将对象列表绑定到列表框,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我曾尝试将对象列表绑定到列表框,但在运行时,列表框中没有项目,列表本身也有项目 列表\u模块 ViewModel代码如下所示。它已被缩短,模块列表的相关代码已包括在内: namespace Users.ViewModel { public class AllUsersViewModel { public List<Module> _modules = new List<Module>(); #region Construc

我曾尝试将对象列表绑定到列表框,但在运行时,列表框中没有项目,列表本身也有项目

列表\u模块

ViewModel代码如下所示。它已被缩短,模块列表的相关代码已包括在内:

namespace Users.ViewModel
{
    public class AllUsersViewModel
    {
        public List<Module> _modules = new List<Module>();

        #region Constructor

        public AllUsersViewModel()
        {
            this.SetModuleList();
            this.CreateAllUsers();
        }

        void SetModuleList()
        {
            _modules = ModuleRepository.GetModules();
        }

        public IEnumerable<Module> Modules
        {
            get { return _modules; }
        }

        void CreateAllUsers()
        {
            List<UserViewModel> all =
                (from cust in _userRepository.GetUsers()
                 select new UserViewModel(cust, _userRepository)).ToList();

            foreach (UserViewModel cvm in all)
                cvm.PropertyChanged += this.OnUserViewModelPropertyChanged;

            this.AllUsers = new ObservableCollection<UserViewModel>(all);
            this.AllUsers.CollectionChanged += this.OnCollectionChanged;
        }

        public ObservableCollection<UserViewModel> AllUsers { get; private set; }

        ....
    }
}
下面是XAML:稍远一点,您将看到一个名为lstModules的列表框

<UserControl.Resources>
    <CollectionViewSource x:Key="UserCollection" Source="{Binding Path=AllUsers}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Name" Direction="Ascending" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</UserControl.Resources>
<DataGrid AutoGenerateColumns="False" ItemContainerStyle="{StaticResource UserItemStyle}" AlternatingRowBackground="{x:Null}" ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
        <DataGridTextColumn Header="Job Title" Binding="{Binding Path=Job_Title}"/>
        <DataGridTextColumn Header="Department" Binding="{Binding Path=Department}"/>
        <DataGridTextColumn Header="Company" Binding="{Binding Path=Company}"/>

        <DataGridTextColumn IsReadOnly="True" Binding="{Binding Path=Company}" CanUserResize="False" Width="580">
            <DataGridTextColumn.Header>
                <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                    <TextBlock HorizontalAlignment="Center">Modules</TextBlock>
                    <ListBox x:Name="lstModules" Width="190" ItemsSource="{Binding Modules}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding ModuleName}"></TextBlock>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
                </StackPanel>
            </DataGridTextColumn.Header>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Contact Detail" Binding="{Binding Path=Name}"/>
    </DataGrid.Columns>
</DataGrid>
[编辑]完整XAML

<UserControl x:Class="Users.View.AllUsersView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
             mc:Ignorable="d" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             d:DesignHeight="160" d:DesignWidth="1100">

    <UserControl.Resources>
        <CollectionViewSource x:Key="UserCollection" Source="{Binding Path=AllUsers}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Name" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>

        <Style x:Key="UserItemStyle" TargetType="{x:Type DataGridRow}">
            <!-- 
              Stretch the content of each cell so that we can 
              right-align text in the Total Sales column. 
              -->
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <!-- 
              Bind the IsSelected property of a ListViewItem to the 
              IsSelected property of a UserViewModel object.
              -->
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <!--
                        <Condition Property="ItemsControl.AlternationIndex" Value="1" />
                        -->
                        <Condition Property="IsSelected" Value="False" />
                        <Condition Property="IsMouseOver" Value="False" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" Value="#EEEEEEEE" />
                </MultiTrigger>
            </Style.Triggers>
        </Style>

        <DataTemplate x:Key="headerTemplate">
            <TextBlock Padding="0,0,0,0" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Bottom" Text="{Binding}"/>
        </DataTemplate>

        <Style x:Key="RowHeaderStyle2" TargetType="DataGridRowsPresenter">
            <Setter Property="Background" Value="{x:Null}"/>
        </Style>
        <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
            <Setter Property="VerticalContentAlignment" Value="Bottom"/>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Height" Value="25"/>
        </Style>
        <Style x:Key="ModuleColumnHeaderStyle" TargetType="GridViewColumnHeader">
            <Setter Property="VerticalContentAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="550"/>
        </Style>
        <Style x:Key="rotatedTextStart" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="12,0,0,0"/>
        </Style>
        <Style x:Key="rotatedTextMiddle" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="-50,0,0,0"/>
        </Style>
        <Style x:Key="rotatedTextEnd" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="-50,0,12,0"/>
        </Style>
        <Style x:Key="ListViewItemRotatedText" TargetType="ListViewItem">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

    <DockPanel>
        <Grid DockPanel.Dock="Bottom" Margin="0,2,4,2">
            <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" VerticalAlignment="Center">
                <TextBlock Text="Selected Users: " />
                <ContentPresenter Content="{Binding Path=TotalSelectedUsers}" ContentStringFormat="0" />
                <TextBlock Text=" of " />
                <ContentPresenter Content="{Binding Path=TotalUsers}" ContentStringFormat="0" />
            </StackPanel>
        </Grid>

        <DataGrid AutoGenerateColumns="False" ItemContainerStyle="{StaticResource UserItemStyle}" AlternatingRowBackground="{x:Null}" DataContext="{StaticResource UserCollection}" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Name}"/>
                <DataGridTextColumn Header="Job Title" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Job_Title}"/>
                <DataGridTextColumn Header="Department" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Department}"/>
                <DataGridTextColumn Header="Company" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Company}"/>

                <DataGridTextColumn IsReadOnly="True" Binding="{Binding Path=Company}" CanUserResize="False" Width="580">
                    <DataGridTextColumn.Header>
                        <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                            <TextBlock HorizontalAlignment="Center">Modules</TextBlock>
                            <ListBox x:Name="lstModules" Width="190" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,  AncestorType={x:Type Window}}, Path=DataContext.Modules}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding ModuleName}"></TextBlock>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </StackPanel>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Contact Detail" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Name}"/>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</UserControl>
ListBox属于DataGrid控件,它有自己的DataContext AllUsers,而没有Modules属性。您应该从UserControl的DataContext获取模块:


就为了让我明白这一点,它已经查找了控件层次结构,直到找到UserControl,UserControl是连接到AllUsersViewModel的AllUsersView,所以它现在知道了Modules属性???发生这种情况是因为我已经在一组数据中了吗?例如,使用AllUsers的DataGrid?这是正确的。ListBox在DataGrid控件中定义,DataGrid控件有自己的DataContext AllUsers,而DataContext AllUsers没有Modules属性。
<UserControl x:Class="Users.View.AllUsersView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
             mc:Ignorable="d" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             d:DesignHeight="160" d:DesignWidth="1100">

    <UserControl.Resources>
        <CollectionViewSource x:Key="UserCollection" Source="{Binding Path=AllUsers}">
            <CollectionViewSource.SortDescriptions>
                <scm:SortDescription PropertyName="Name" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>

        <Style x:Key="UserItemStyle" TargetType="{x:Type DataGridRow}">
            <!-- 
              Stretch the content of each cell so that we can 
              right-align text in the Total Sales column. 
              -->
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <!-- 
              Bind the IsSelected property of a ListViewItem to the 
              IsSelected property of a UserViewModel object.
              -->
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <!--
                        <Condition Property="ItemsControl.AlternationIndex" Value="1" />
                        -->
                        <Condition Property="IsSelected" Value="False" />
                        <Condition Property="IsMouseOver" Value="False" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" Value="#EEEEEEEE" />
                </MultiTrigger>
            </Style.Triggers>
        </Style>

        <DataTemplate x:Key="headerTemplate">
            <TextBlock Padding="0,0,0,0" Margin="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Bottom" Text="{Binding}"/>
        </DataTemplate>

        <Style x:Key="RowHeaderStyle2" TargetType="DataGridRowsPresenter">
            <Setter Property="Background" Value="{x:Null}"/>
        </Style>
        <Style x:Key="ColumnHeaderStyle" TargetType="DataGridColumnHeader">
            <Setter Property="VerticalContentAlignment" Value="Bottom"/>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Height" Value="25"/>
        </Style>
        <Style x:Key="ModuleColumnHeaderStyle" TargetType="GridViewColumnHeader">
            <Setter Property="VerticalContentAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="550"/>
        </Style>
        <Style x:Key="rotatedTextStart" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="12,0,0,0"/>
        </Style>
        <Style x:Key="rotatedTextMiddle" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="-50,0,0,0"/>
        </Style>
        <Style x:Key="rotatedTextEnd" TargetType="TextBlock">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
            <Setter Property="VerticalAlignment" Value="Bottom"/>
            <Setter Property="Width" Value="130"/>
            <Setter Property="Margin" Value="-50,0,12,0"/>
        </Style>
        <Style x:Key="ListViewItemRotatedText" TargetType="ListViewItem">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="-45" />
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>

    <DockPanel>
        <Grid DockPanel.Dock="Bottom" Margin="0,2,4,2">
            <StackPanel HorizontalAlignment="Right" Orientation="Horizontal" VerticalAlignment="Center">
                <TextBlock Text="Selected Users: " />
                <ContentPresenter Content="{Binding Path=TotalSelectedUsers}" ContentStringFormat="0" />
                <TextBlock Text=" of " />
                <ContentPresenter Content="{Binding Path=TotalUsers}" ContentStringFormat="0" />
            </StackPanel>
        </Grid>

        <DataGrid AutoGenerateColumns="False" ItemContainerStyle="{StaticResource UserItemStyle}" AlternatingRowBackground="{x:Null}" DataContext="{StaticResource UserCollection}" ItemsSource="{Binding}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Name}"/>
                <DataGridTextColumn Header="Job Title" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Job_Title}"/>
                <DataGridTextColumn Header="Department" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Department}"/>
                <DataGridTextColumn Header="Company" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Company}"/>

                <DataGridTextColumn IsReadOnly="True" Binding="{Binding Path=Company}" CanUserResize="False" Width="580">
                    <DataGridTextColumn.Header>
                        <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                            <TextBlock HorizontalAlignment="Center">Modules</TextBlock>
                            <ListBox x:Name="lstModules" Width="190" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,  AncestorType={x:Type Window}}, Path=DataContext.Modules}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding ModuleName}"></TextBlock>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                        </StackPanel>
                    </DataGridTextColumn.Header>
                </DataGridTextColumn>
                <DataGridTextColumn Header="Contact Detail" IsReadOnly="True" HeaderStyle="{StaticResource ColumnHeaderStyle}" HeaderTemplate="{StaticResource headerTemplate}" Binding="{Binding Path=Name}"/>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</UserControl>
<ListBox x:Name="lstModules" Width="190" 
    ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
         AncestorType={x:Type UserControl}},
         Path=DataContext.Modules}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ModuleName}"></TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>