在WPF C#中,在基于组合框的列表视图中显示项目时出现问题
本文关键字:视图 显示 列表 项目 问题 WPF 于组合 组合 | 更新日期: 2023-09-27 18:25:22
我来自Windows窗体的有限背景,正在跳转到WPF。仍在努力进行数据绑定
所以我有一个WPF应用程序,它非常简单。我有一个ADO.Net实体模型,里面有我所有的数据库信息。基本上我有一个组合框,它包含数据库中所有项目的名称。这部分工作正常。我在它下面有一个ListView,它将显示其他列,例如Qty。现在我只想在Listview中加载一行和一列数据。一开始很简单。一旦我做对了,我将添加其他列。我最初遇到的问题是,如果我只绑定了这两个对象(组合框和列表视图),则列表视图将显示数据库中的所有行。isSynchronizedWithCurrentItem只会使列表视图突出显示组合框中选择的内容。我想通过组合框中的选择缩小范围。这是我能在这个网站上挖掘到的最好的结果,我有几个boos,所以任何信息都会有帮助!
来自WinForms的我曾经使用表适配器来保存带有参数的查询,这些参数可以用来返回数据,这使得重用查询变得更加容易。如果有一种方法可以用ADO.net做到这一点,那就太棒了!
我的XAML看起来像这个
<Window x:Class="InventoryTest.TestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Information" Height="362" Width="614"
Loaded="Window_Loaded">
<Window.Resources>
<DataTemplate x:Key="InventoryTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=InventoryName}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ComboBox x:Name="ingNameCB" Margin="40,16,42,0" VerticalAlignment="Top" Height="23" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" ItemTemplate="{StaticResource InventoryTemplate}" ></ComboBox>
<Button x:Name="saveChanges" Content="Save Changes" HorizontalAlignment="Left" Margin="40,0,0,10" VerticalAlignment="Bottom" Width="90" IsEnabled="False" Height="23"/>
<ListView x:Name="ingListLV" Margin="40,44,40,165" IsSynchronizedWithCurrentItem="True" DataContext="{Binding ElementName=ingNameCB, Path=SelectedItem}">
<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn Width="100" Header="Qty" DisplayMemberBinding="{Binding Path=Qty}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</Grid>
我的代码如下:
public partial class SupplierInfo : Window
{
private AuroraEntities1 auroraContext = null;
public SupplierInfo()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.auroraContext = new AuroraEntities1();
//Connects the combobox to the database. the datatemplate and databindings display the proper values
ingNameCB.DataContext = this.auroraContext.Inventories;
//Selects the row QTY where InventoryName is equal to the current selection of the combobox
ObjectQuery<Inventory> inventories = auroraContext.Inventories;
string name = ingNameCB.SelectedItem.ToString();
var FillList = from q in inventories
where q.InventoryName == name
select q.Qty.ToString();
//Fills the listview with only the selected qty
ingListLV.ItemsSource = FillList.ToString();
}
}
}
ListView.ItemsSource
应该是一个集合类型。要直接设置ItemsSource
,我想你想要的是:
var FillList = from q in inventories
where q.InventoryName == name
select q;
ingListLV.ItemsSource = FillList.ToList();
但是,听起来您希望在用户更改选择时更新/重新查询列表,对吗?有多种方法可以做到这一点;一种方法是数据绑定属性,如"Items",它将在更改时被重新查询。通常你会想使用视图模型,但为了简单起见,我会使用代码:
<Window
...
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
使Window类实现INotifyPropertyChanged
,并赋予其SelectedItem
和Items
属性:
public partial class SupplierInfo : Window, INotifyPropertyChanged
{
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
RaisePropertyChanged("InventoryItems");
}
}
private string _selectedItem;
public List<Inventory> InventoryItems
{
get
{
var FillList = from q in inventories
where q.InventoryName == SelectedItem
select q;
return FillList.ToList();
}
}
...
}
现在将ComboBox绑定到SelectedItem
属性:
<ComboBox x:Name="ingNameCB" SelectedItem="{Binding SelectedItem,Mode=TwoWay}" ... />
最后,将ListView
绑定到InventoryItems
属性(注意,每当用户在组合框中选择新项目时,就会刷新该属性,从而触发对InventoryItems
的getter的调用,从而重新查询数据源):
<ListView ItemsSource="{Binding InventoryItems}" ... />