在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();  
    }
}

}

在WPF C#中,在基于组合框的列表视图中显示项目时出现问题

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,并赋予其SelectedItemItems属性:

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}" ... />