1

我来自 Windows 窗体的有限背景并跳到 WPF。仍在为数据绑定而苦苦挣扎。
所以我有一个 WPF 应用程序,它非常简单。我有一个 ADO.Net 实体模型,其中包含我的所有数据库信息。我正在处理一张有几列的表。基本上我有一个组合框,其中包含数据库中所有项目的名称。这部分工作正常。我在它下面是一个 ListView,它将显示其他列,例如 Qty。现在我只想用一列数据将一行加载到 Listview 中。开始很简单。一旦我做对了,我将添加其他列。我最初遇到的问题是,如果我只绑定两个对象(组合框和列表视图),列表视图将显示数据库中的所有行。isSynchronizedWithCurrentItem 只会使列表视图突出显示在组合框中选择的任何内容。我想通过组合框中的选择来缩小范围。这是我能想出的最好的挖掘这个网站和我有几个嘘声,所以任何信息都会有帮助!

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

}

4

1 回答 1

1

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

最后,将 绑定ListViewInventoryItems属性(请注意,每当用户在组合框中选择新项目时都会刷新,触发对 的 getter 的调用InventoryItems,从而重新查询数据源):

<ListView ItemsSource="{Binding InventoryItems}" ... />
于 2013-07-27T23:03:07.990 回答