【发布时间】:2016-04-11 17:20:10
【问题描述】:
这里是 WPF 的新手。正在构建的应用程序具有从数据库中提取的用户列表,以显示在“用户”窗口中,可从“主”窗口导航。该列表似乎已转移到后面的代码中,但用户列表未显示在“用户”窗口列表框中。有谁知道为什么这没有显示?非常感谢!
“主”窗口导向:
UsersViewModel Usersvm = new UsersViewModel();
Usersvm.Users = new List<UserViewModel>();
DbEntities db = new DbEntities();
var pulledUsers = db.uspGetUsers().ToList();
foreach (var result in pulledUsers)
{
var pulledUser = new UserViewModel
{
FirstName = result.FirstName,
LastName = result.LastName,
EMail = result.Email,
UserID = result.UserID,
Position = result.Position,
EndDate = result.EndDate,
};
Usersvm.Users.Add(pulledUser);
}
new UsersWindow(Usersvm).Show();
UsersWindow 后面的代码:
public partial class UsersWindow : Window
{
public UsersWindow(UsersViewModel uvm)
{
InitializeComponent();
listboxUsers.ItemsSource = uvm.Users;
}
}
UsersWindow.xaml:
<Window x:Class="DbEntities.UsersWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DbEntities"
mc:Ignorable="d"
Title="UsersWindow" Height="Auto" Width="900">
<Window.Resources>
<Style x:Key="borderBase" TargetType="Border">
<Setter Property="BorderBrush" Value="Black" />
<Setter Property="BorderThickness" Value="1" />
</Style>
</Window.Resources>
<StackPanel>
<TextBlock x:Name="textBlock" Height="21" Margin="0,0,161,0" TextWrapping="Wrap"
Text="Users Page" VerticalAlignment="Top" RenderTransformOrigin="1.022,0.409" HorizontalAlignment="Right" Width="344"/>
<Grid>
<Grid Grid.IsSharedSizeScope="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="151*" />
<ColumnDefinition Width="95*" />
<ColumnDefinition Width="110*" />
<ColumnDefinition Width="351*" />
<ColumnDefinition Width="75*" />
<ColumnDefinition Width="110*" />
</Grid.ColumnDefinitions>
<Border Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" Text="Last Name" />
</Border>
<Border Grid.Column="1" Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" Text="First Name" />
</Border>
<Border Grid.Column="2" Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" Text="Position" />
</Border>
<Border Grid.Column="3" Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" Text="Email" />
</Border>
<Border Grid.Column="4" Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" Text="End Date" />
</Border>
<Border Grid.Column="5" Style="{StaticResource borderBase}">
<TextBlock HorizontalAlignment="Center" />
</Border>
<ListBox x:Name="listboxUsers" HorizontalAlignment="Center" Height="Auto" Margin="3,25,0,0" VerticalAlignment="Top" Width="889"
ItemsSource="{Binding Users}" Grid.ColumnSpan="6">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="LastNameColumn" />
</Grid.ColumnDefinitions>
<Border Style="{StaticResource borderBase}">
<TextBlock Text="{Binding LastName}"/>
</Border>
<Border Style="{StaticResource borderBase}">
<TextBlock Text="{Binding FirstName}"/>
</Border>
<Border Style="{StaticResource borderBase}">
<TextBlock Text="{Binding Position}"/>
</Border>
<Border Style="{StaticResource borderBase}">
<TextBlock Text="{Binding Email}"/>
</Border>
<Border Style="{StaticResource borderBase}">
<TextBlock Text="{Binding EndDate}"/>
</Border>
<Border Style="{StaticResource borderBase}">
<Button Content="Edit" x:Name="editButton" Click="editButton_Click"/>
</Border>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
</Grid>
</StackPanel>
</Window>
最后是带有用户联系信息列表的 UsersViewModel:
public partial class UsersViewModel : Window
{
public List<UserViewModel> Users { get; set; }
}
编辑(已解决): Ed Plunkett 的 cmets 和 answer 直接解决了最初的 ListBox 问题,并将该输入与 Monty 巧妙呈现的 ThyArtIsCode 结合使用,过程更加优雅。感谢所有回复的人 - 这里有很多很棒的学习资料。
【问题讨论】:
-
如果你在这一行设置断点 Usersvm.Users.Add(pulledUser);您在 pullUser 中看到任何值吗?
-
UsersViewModel : Window 为什么你继承了 UsersViewModel 中的窗口类??
-
首先:
Usersvm.Users的类型必须是ObservableCollection<UserViewModel>,而不是List。List不会在其内容更改时通知 UI。ObservableCollection将。其次,UsersViewModel 不应该是一个窗口。窗口与视图模型无关。接下来,它应该实现 INotifyPropertyChanged 并在为用户分配新集合时触发PropertyChanged接下来,不要在代码隐藏中分配给 ItemsSource。那不是绑定。有了上面的内容,XAML 中的绑定应该可以正常工作。 -
但最重要的是,UsersViewModel 的实例必须是 Window 的 DataContext,才能使 XAML 绑定起作用。在InitializeComponent();之后的
public UsersWindow,只做var vm = new UsersViewModel();,初始化它,然后DataContext = vm; -
@jle 我认为您的代码有太多错误无法给出简单的答案,如果这是真正的工作代码,请将其还给原始开发人员(如果他仍然与您合作),如果这是你自己的家庭代码,你可能想看看这个rachel53461.wordpress.com/2011/05/08/simplemvvmexample