当这个项目更新时,我试图让一个组合框反映底层视图模型中的变化,我试图遵循MVVM方法并使用INotifypropertyChanged
,但无论我尝试什么,我都会错过一些事情。
我很确定我的DataContext
是正确的-PropertyChanged
事件触发,集合是从我的DAL填充的,我已经尝试在xaml中为combobox指定SourceUpdateTrigger
-我只是不知道布线的中断在哪里。非常感谢您的帮助,也很乐意指导常见的示例。
组合框的XAML
<ComboBox ItemsSource="{Binding partsResultsCollection}" x:Name="searchInput" TextBoxBase.TextChanged="searchInput_TextChanged" HorizontalAlignment="Left" Margin="231,88,0,0" VerticalAlignment="Top" Width="316" Height="25" IsEditable="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock FontWeight="Bold" Text="PartNO:"/>
<TextBlock Text="{Binding Path=PartNumber}" Padding="10,0"/>
<TextBlock FontWeight="Bold" Text="DESC:"/>
<TextBlock Text="{Binding Path=Description}" Padding="10,0"/>
<TextBlock FontWeight="Bold" Text="QOH:"/>
<TextBlock Text="{Binding Path=QtyOnHand}" Padding="10,0"/>
<TextBlock FontWeight="Bold" Text="WHQ:"/>
<TextBlock Text="{Binding Path=WarehouseQTY}" Padding="10,0"/>
<TextBlock FontWeight="Bold" Text="LastSold:"/>
<TextBlock Text="{Binding Path=LastSold}" Padding="10,0"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
ViewModel类
class PartsResultsVM : INotifyPropertyChanged
{
public ObservableCollection<PartsResults> _partsResultsCollection;
private PartsResults _singularPartResult;
public PartsDAL partsDAL = new PartsDAL();
public ObservableCollection<PartsResults> partsResultsCollection
{
get { return _partsResultsCollection; }
set {
if (partsResultsCollection != value)
_partsResultsCollection = value;
OnPropertyChanged("partsResultCollection");
}
}
public PartsResults singularPartResult
{
get { return _singularPartResult; }
set {
if (singularPartResult != value)
{
_singularPartResult = value;
OnPropertyChanged("singularPart");
}
_singularPartResult = value; }
}
public PartsResultsVM()
{
_partsResultsCollection = new ObservableCollection<PartsResults>();
}
public void Update(String Query)
{
_partsResultsCollection.Clear();
_partsResultsCollection = partsDAL.getPartListing(Query);
OnPropertyChanged("Update");
Debug.WriteLine("partresultcollection contains:" + _partsResultsCollection.Count + " Items");
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
Debug.WriteLine("PropertyChanged event fired info " + info);
}
}
包含组合框的页面
public partial class PartsManagement : Page
{
private String connectionString;
private PartsResultsVM partsResultsVM;
public PartsManagement()
{
InitializeComponent();
connectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:RegisterSourceCodeDataBaseMedicar.mdb";
partsResultsVM = new PartsResultsVM();
this.DataContext = partsResultsVM;
}
private void searchInput_TextChanged(object sender, TextChangedEventArgs e)
{
partsResultsVM.Update(searchInput.Text);
}
}
添加部分结果模型类
public class PartsResults
{
private string partNumber;
private string description;
private int qtyOnHand;
private int warehouseQTY;
private DateTime lastSupplied;
public string PartNumber
{
get {return partNumber;}
set
{
partNumber = value;
//this.RaisePropertyChanged("Partnumber");
}
}
public string Description
{
get {return description;}
set
{
description = value;
//this.RaisePropertyChanged("Description");
}
}
public int QtyOnHand
{
get{return qtyOnHand;}
set
{
qtyOnHand = value;
// this.RaisePropertyChanged("QtyOnHand");
}
}
public int WarehouseQTY
{
get{return warehouseQTY;}
set
{
warehouseQTY = value;
//this.RaisePropertyChanged("WarehouseQTY");
}
}
public DateTime LastSupplied
{
get { return lastSupplied; }
set
{
lastSupplied = value;
// this.RaisePropertyChanged("LastSupplied");
}
}
}
我想我理解这个问题。您需要ICollectionView
接口来显示数据。在这里你可以找到更详细的信息。
集合查看
在ViewModel中应用以下更改。
public ICollectionView partsResultsCollectionView { get; private set; }
public ObservableCollection<PartsResults> partsResultsCollection = new ObservableCollection<PartsResults>();
public PartsResultsVM()
{
partsResultsCollectionView = CollectionViewSource.GetDefaultView(partsResultsCollection);
partsResultsCollection.Add(new PartsResults { PartNumber = "PartNumber1", Description = "Description1", LastSold = "LastSold1", QtyOnHand = "QtyOnHand1", WarehouseQTY = "WarehouseQTY1" });
}
如果要对以前添加的PartResults元素进行更改。您应该为每个项实现INotifyPropertyChanged。
注意:我没有看到您添加PartResults类。所以我以为它们都是字符串。你修复了它:(
因此,问题似乎与DAL的结果分配有关,此处为
_partsResultsCollection = partsDAL.getPartListing(Query);
其不会发射";ObservableCollection.CollectionChanged事件";
https://learn.microsoft.com/en-us/dotnet/api/system.collections.objectmodel.observablecollection-1.collectionchanged?view=net-6.0
绑定到组合框的ObservableCollection没有通知的更改
按照更新ObservableCollection时
results = partsDAL.getPartListing(Query);
foreach (PartsResults partsResults in results)
{
_partsResultsCollection.Add(partsResults);
}
在没有其他修改的情况下,组合框按预期填充。