从视图模型内的observalecollection绑定到combobox数据模板



当这个项目更新时,我试图让一个组合框反映底层视图模型中的变化,我试图遵循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);
}

在没有其他修改的情况下,组合框按预期填充。

最新更新