C# WPF列表绑定失败
我已经按照老师的指示做了。然而,我的绑定似乎失败了,因为我的窗口中没有结果。我想做的只是将列表项绑定到ListView。 XAML文件内容:C# WPF列表绑定失败,c#,wpf,xaml,C#,Wpf,Xaml,我已经按照老师的指示做了。然而,我的绑定似乎失败了,因为我的窗口中没有结果。我想做的只是将列表项绑定到ListView。 XAML文件内容: <Window x:Class="IV_sem___PwSG___WPF_task1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200
<Window x:Class="IV_sem___PwSG___WPF_task1.MainWindow"
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:IV_sem___PwSG___WPF_task1"
mc:Ignorable="d"
Title="MainWindow" Height="600" Width="800"
MinHeight="500" MinWidth="500">
<Window.Resources>
<DataTemplate x:Key="MyItemTemplate">
<Grid Margin="5" Background="Aqua">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" Grid.Column="0" Grid.Row="0"
FontSize="18" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Description}" Grid.Column="0" Grid.Row="1"
FontSize="14" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Category}" Grid.Column="0" Grid.Row="2"
FontSize="12" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Price}" Grid.Column="1" Grid.RowSpan="1"></TextBlock>
<Button Content="Add to cart" Grid.Column="2" Grid.Row="1"/>
</Grid>
</DataTemplate>
</Window.Resources>
<!--<Window.DataContext>
<local:MainWindow />
</Window.DataContext>-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Menu Grid.Column="0" Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="Load"/>
<MenuItem Header="Save"/>
<Separator/>
<MenuItem Header="Exit" Click="ExitMenuItem_Click"/>
</MenuItem>
<MenuItem Header="Products">
<MenuItem Header="Add products" Click="AddProductMenuItem_Click"/>
<MenuItem Header="Clear products"/>
</MenuItem>
<MenuItem Header="About" Click="AboutMenuItem_Click"/>
</Menu>
<TabControl Grid.Column="0" Grid.Row="1">
<TabItem Header="Shop">
<!--<Grid>-->
<ListView ItemsSource="{Binding itemList}"
ItemTemplate="{StaticResource MyItemTemplate}"/>
<!--</Grid>-->
</TabItem>
<TabItem Header="Warehouse">
</TabItem>
</TabControl>
</Grid>
namespace IV_sem___PwSG___WPF_task1{
public partial class MainWindow : Window
{
public List<Item> itemList { get; set; }
public MainWindow()
{
itemList = new List<Item>();
InitializeComponent();
}
private void AboutMenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("This is simple shop manager.", "About application", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
public class Item
{
string Name { get; set; }
string Description { get; set; }
Category Category { get; set; }
double Price { get; set; }
public Item(string a, string b, Category c, double d)
{
Name = a; Description = b; Category = c; Price = d;
}
}
private void AddProductMenuItem_Click(object sender, RoutedEventArgs e)
{
itemList.Add(new Item("Computer", "Computer's description", Category.Electronics, 2499.99));
itemList.Add(new Item("Apple", "Apple's description", Category.Food, 1.99));
itemList.Add(new Item("Computer", "Computer's description", Category.Electronics, 2499.99));
}
}
public enum Category
{
Electronics, Food
}
}
.cs文件内容:
<Window x:Class="IV_sem___PwSG___WPF_task1.MainWindow"
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:IV_sem___PwSG___WPF_task1"
mc:Ignorable="d"
Title="MainWindow" Height="600" Width="800"
MinHeight="500" MinWidth="500">
<Window.Resources>
<DataTemplate x:Key="MyItemTemplate">
<Grid Margin="5" Background="Aqua">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding Name}" Grid.Column="0" Grid.Row="0"
FontSize="18" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Description}" Grid.Column="0" Grid.Row="1"
FontSize="14" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Category}" Grid.Column="0" Grid.Row="2"
FontSize="12" FontFamily="Arial"></TextBlock>
<TextBlock Text="{Binding Price}" Grid.Column="1" Grid.RowSpan="1"></TextBlock>
<Button Content="Add to cart" Grid.Column="2" Grid.Row="1"/>
</Grid>
</DataTemplate>
</Window.Resources>
<!--<Window.DataContext>
<local:MainWindow />
</Window.DataContext>-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Menu Grid.Column="0" Grid.Row="0">
<MenuItem Header="File">
<MenuItem Header="Load"/>
<MenuItem Header="Save"/>
<Separator/>
<MenuItem Header="Exit" Click="ExitMenuItem_Click"/>
</MenuItem>
<MenuItem Header="Products">
<MenuItem Header="Add products" Click="AddProductMenuItem_Click"/>
<MenuItem Header="Clear products"/>
</MenuItem>
<MenuItem Header="About" Click="AboutMenuItem_Click"/>
</Menu>
<TabControl Grid.Column="0" Grid.Row="1">
<TabItem Header="Shop">
<!--<Grid>-->
<ListView ItemsSource="{Binding itemList}"
ItemTemplate="{StaticResource MyItemTemplate}"/>
<!--</Grid>-->
</TabItem>
<TabItem Header="Warehouse">
</TabItem>
</TabControl>
</Grid>
namespace IV_sem___PwSG___WPF_task1{
public partial class MainWindow : Window
{
public List<Item> itemList { get; set; }
public MainWindow()
{
itemList = new List<Item>();
InitializeComponent();
}
private void AboutMenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("This is simple shop manager.", "About application", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
public class Item
{
string Name { get; set; }
string Description { get; set; }
Category Category { get; set; }
double Price { get; set; }
public Item(string a, string b, Category c, double d)
{
Name = a; Description = b; Category = c; Price = d;
}
}
private void AddProductMenuItem_Click(object sender, RoutedEventArgs e)
{
itemList.Add(new Item("Computer", "Computer's description", Category.Electronics, 2499.99));
itemList.Add(new Item("Apple", "Apple's description", Category.Food, 1.99));
itemList.Add(new Item("Computer", "Computer's description", Category.Electronics, 2499.99));
}
}
public enum Category
{
Electronics, Food
}
}
名称空间IV\u sem\uuuuuuu PwSG\uuuuuuuuwpf\u任务1{
公共部分类主窗口:窗口
{
公共列表项列表{get;set;}
公共主窗口()
{
itemList=新列表();
初始化组件();
}
关于菜单项的私有void\u单击(对象发送方,路由目标)
{
Show(“这是简单的商店经理”,“关于应用程序”,MessageBoxButton.OK,MessageBoxImage.Information);
}
私有void ExitMenuItem\u单击(对象发送者,路由目标)
{
这个。关闭();
}
公共类项目
{
字符串名称{get;set;}
字符串说明{get;set;}
类别{get;set;}
双倍价格{get;set;}
公共项目(字符串a、字符串b、类别c、双d)
{
名称=a;描述=b;类别=c;价格=d;
}
}
私有void AddProductMenuItem\u单击(对象发送者、路由目标)
{
项目列表。添加(新项目(“计算机”,“计算机说明”,类别。电子,2499.99));
添加(新项目(“苹果”,“苹果的描述”,类别。食品,1.99));
项目列表。添加(新项目(“计算机”,“计算机说明”,类别。电子,2499.99));
}
}
公共枚举类别
{
电子、食品
}
}
类别是枚举类型。
列表是MainWindow类的属性。
它应该根据上面的链接工作。问题中的代码有三个问题 1。ListView.ItemsSource绑定 程序不会为ListView或其父容器之一设置DataContext。因此,
中的绑定无法解决
由于itemList是MainWindow本身的一个属性,作为一个快速修复方法,我建议将MainWindow DataContext绑定到MainWindow本身:
<Window x:Class="IV_sem___PwSG___WPF_task1.MainWindow"
...
...
x:Name="Self"
DataContext="{Binding ElementName=Self}"
>
2。项目列表 itemList只是一个简单的
列表
集合<代码>列表没有内置机制,在列表中添加或删除项目时通知ListView和绑定引擎。当程序将项目添加到AddProductMenuItem\u Click处理程序中的itemList时,ListView不会更新,原因很简单,因为没有通知它itemList已更改
解决方法相当简单:使用observetecollection
而不是List
。ObservableCollection提供有关项目添加和删除的通知。WPF可以理解这些通知,并使ListView能够在更改集合时刷新其视图
3。项目类别 itemList集合包含
项
对象。ListView使用的项目模板中的UI元素绑定到这些项目对象的属性。但是,项
类的属性不是公共的。如果这些属性不是公共的,则绑定到这些属性失败
修复方法同样非常简单:公开参与绑定的所有属性。使用可观察集合,而不是下面的列表
public ObservableCollection<Item> itemList { get; set; }
publicobservableCollection项目列表{get;set;}
由于使用INotifyCollectionChanged实现的可观察集合,INotifyPropertyChanged更改了它的notify Collection更改事件和更新UI。您绑定到DataContext中任何对象的属性“itemList”。项目列表在哪里?它存在吗?什么是数据上下文?或者换句话说:ListView.ItemsSource绑定的绑定源确实存在吗?@elgonzo itemList在MainWindow()
constructor中初始化,并填充了一些元素。DataContext肯定是包含MainWindow
类的名称空间,因为它是到目前为止我的项目中唯一的名称空间。我尝试在.cs中将itemList
分配给this.DataContext
,并在XAML中仅使用“{Binding}”
而不是“{Binding itemList}”
,这没有任何区别。我能再给你一些密码吗?好的。显示itemList的集合类型、填充位置和方式,以及为窗口设置DataContext的位置/方式。用这些信息展开你的问题(不要试图在评论中解释它…)我是否忽略了它,但是你在哪里为你的窗口设置了DataContext?我看到它在XAML中被注释掉了……我刚才概述的问题场景与绑定或数据上下文无关。您的困惑可能是因为还不习惯(我承认有点难看)XAML语法。当您的程序最终对XAML的这一部分进行评估以呈现UI时,它会指示您的程序创建一个MainWindow对象(即新建MainWindow();
)。像
会指示您的程序创建一个按钮对象…”“我建议将MainWindow的DataContext绑定到MainWindow本身”-这不是像MainWindow的DataContext默认设置为自身吗?属性不是公共的!这就是问题所在。。。关于DataContext:DataContext在默认情况下没有值(它是空的)。我在回答中提出的快速解决方案