Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF列表绑定失败_C#_Wpf_Xaml - Fatal编程技术网

C# WPF列表绑定失败

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

我已经按照老师的指示做了。然而,我的绑定似乎失败了,因为我的窗口中没有结果。我想做的只是将列表项绑定到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/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在默认情况下没有值(它是空的)。我在回答中提出的快速解决方案