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。
我有使用 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。