WPF。如何将数据从代码绑定到 ListView

WPF. How to binding data from code to ListView

我有使用 Style 和 ControlTemplate 编写的 ListView,但我无法显示 code-behind 中的列表,也许有人知道该怎么做? 程序正在运行,ListView Column Header 正在显示,滚动条也在显示,但没有数据 listView 项目出现。目前我写的是:

xaml: 所有Style都写在ControlTemplate之前。

...<ControlTemplate x:Key="rounded" TargetType="ListView">
            <Border BorderBrush="Black" BorderThickness="0"  Height="490" Width="900" Margin="30,98,362,30"
                    HorizontalAlignment="Left" VerticalAlignment="Top" CornerRadius="8,8,0,0">
                <Grid>
                    <Border Name="myBorder" CornerRadius="8,8,0,0" Background="White" Margin="1"/>
                    <Grid>
                        <Grid.OpacityMask>
                            <VisualBrush Visual="{Binding ElementName=myBorder}"/>
                        </Grid.OpacityMask>
                        <ListView Style="{StaticResource ListView}" ScrollViewer.VerticalScrollBarVisibility="Visible"
                                  AlternationCount="2" ScrollViewer.CanContentScroll="False" SizeChanged="Size">
                            <ListView.View>
                                <GridView>
                                    <GridViewColumn>
                                        <GridViewColumnHeader Content="Product" Margin="10,0,0,0" 
                                                              Style="{StaticResource GridViewColumnHeader}"/>
                                        <GridViewColumn.CellTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Vertical">
                                                    <Grid Height="42px" >
                                                        <TextBlock Text="{Binding odd}" VerticalAlignment="Center"  
                                                                   TextAlignment="Left" />
                                                    </Grid>
                                                    <TextBlock Text="{Binding discountText}" Padding="10,5,0,0" Style="{StaticResource MainText}"/>
                                                </StackPanel>
                                            </DataTemplate>
                                        </GridViewColumn.CellTemplate>
                                    </GridViewColumn>

.....

    <ListView Template="{StaticResource rounded}" 
ItemsSource="{Binding temp}" ItemContainerStyle="{StaticResource ListViewItem}">

.cs:

public class MyData
    {
        public string odd { get; set; }
        public double unitPrice { get; set; }
        public string quantity { get; set; }
        public double Price { get; set; }
        public bool IsDiscount { get; set; }
        public string discounText { get; set; }
        public double discountUnit { get; set; }
        public double discountPrice { get; set; }
    }


    public partial class MainWindow : Window
    {
    public List<MyData> temp
            {
                get; set; }


            public MainWindow()
            {
                InitializeComponent();

                List<MyData> sampleData = new List<MyData>

              {
                 new MyData{odd="Name 1", unitPrice=999999.99, quantity ="India1777. .hl978", Price=99999.99, 
                     IsDiscount=false, discounText="Surname 1", discountUnit=186, discountPrice=1.01},
                 new MyData{odd="Name 2", unitPrice=41.87, quantity ="India2", Price=47.56,
                     IsDiscount=false, discounText="Surname 2", discountUnit=84, discountPrice=12.45},
                 new MyData{odd="Name 3", unitPrice=234, quantity ="India3", Price=1.01,
                     IsDiscount=false, discounText="Surname 3", discountUnit=2744, discountPrice=45.84},
                 new MyData{odd="Name 4", unitPrice=2.45, quantity ="India4", Price=1.04,
                     IsDiscount=false, discounText="Surname 4", discountUnit=852, discountPrice=12},
     };
                temp = sampleData;

您可以将 sampleData 实现为 ObservableCollection:

ObservableCollection<MyData> temp = new ObservableCollection<MyData>();

并将项目直接添加到临时 属性:

temp.Add(new MyData {...});

您还可以从 INotifyPropertyChanged 接口继承您的 MainWindow:

public partial class MainWindow : INotifyProppertyChanged
{
    public List<MyData> temp
    { 
        get 
        {
            return _temp;
        } 
        set
        {
            _temp = value;
            OnPropertyChanged();
        }
    }
    private List<MyData> _temp;

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

当您实施 InitializeComponent() 时,您将绑定到尚未填充的 List<>

此外,当 List<> 填充时,MyData 的属性当前不会引发事件...因此没有任何通知视图它需要更新。

要在 InitializeComponent() 之后显示 List<> 的更改,您需要确保 List<> 中的属性实现 INotifyPropertyChanged

有关详细信息,请参阅 this MSDN link