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