ObservableCollection依赖项属性未在Usercontrol上更新
本文关键字:Usercontrol 更新 依赖 属性 ObservableCollection | 更新日期: 2023-09-27 18:00:36
这里的可观察集合正在更新,但它没有反映在UI上。
XAML
<ComboBox Name="ProductsCombo" Width="200" Grid.Column="1" HorizontalAlignment="Left"
ItemsSource="{Binding Products}"
DisplayMemberPath="Name"
SelectedValue="ID"
SelectionChanged="OnProductSelected"/>
<Button Click="AddNewProduct" Content="Add New Product" Width="105" Margin="5"/>
在后面的代码中
public partial class ProductsAdd : UserControl
{
SampleContext DbContext = new MedicalShopContext();
public ProductsAdd()
{
DataContext = this;
InitializeComponent();
Products = new ObservableCollection<Product>(DbContext.Products);
ProductsCombo.SelectedItem = Products[0];
}
public void AddNewProduct(string ProductName, string ProductDescription)
{
NewProduct = new Product()
{
Name = ProductName,
Description = ProductDescription
};
DbContext.Products.Add(NewProduct);
DbContext.SaveChanges();
Products.Add(NewProduct);
}
public ObservableCollection<Product> Products
{
get { return (ObservableCollection<Product>)GetValue(ProductsProperty); }
set { SetValue(ProductsProperty, value); }
}
public static readonly DependencyProperty ProductsProperty =
DependencyProperty.Register("Products",
typeof(ObservableCollection<Product>),
typeof(ProductsAdd),
new PropertyMetadata(null));
public Product NewProduct
{
get { return (Product)GetValue(NewProductProperty); }
set { SetValue(NewProductProperty, value); }
}
// Using a DependencyProperty as the backing store for NewProduct. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NewProductProperty =
DependencyProperty.Register("NewProduct",
typeof(Product),
typeof(ProductsAdd),
new PropertyMetadata(null));
private void AddNewProduct(object sender, RoutedEventArgs e)
{
NewProductInput productInputWindow = new NewProductInput();
productInputWindow.Show();
}
}
如果我们从同一个UI调用,则上述绑定有效。但从其他窗口调用时不更新
下面是点击按钮上显示的新窗口的代码
public partial class NewProductInput : Window
{
public NewProductInput()
{
InitializeComponent();
}
private void Close(object sender, RoutedEventArgs e)
{
ProductsAdd productsAddWindow = new ProductsAdd();
productsAddWindow.AddNewProduct(txtProductName.Text, txtProductDescription.Text);
this.Close();
}
}
问题是在UI控件中,Products集合只填充一次,然后永远不会更新。
Products = new ObservableCollection<Product>(DbContext.Products);
当你写这篇文章时,这意味着Observable集合将包含DbContext.Products中的相同项,但如果DbContext.Poduces发生更改,它将不会更新。当一扇窗户关上时,就会发生这种情况。我建议您处理Closed事件,并以相同的方式重新创建集合。
private void AddNewProduct(object sender, RoutedEventArgs e)
{
NewProductInput productInputWindow = new NewProductInput();
productInputWindow.Show();
productInputWindow.Closed += OnProductInputWindowClosed;
}
private void OnProductInputWindowClosed(object sender, RoutedEventArgs e)
{
(sender as Window).Closed -= OnProductInputWindowClosed;
Products = new ObservableCollection<Product>(DbContext.Products);
}
这是最简单的解决方案,但不是最好的,因为这将强制重新创建组合框中的所有UI项。
看起来您有两个不同的ProductsAdd用户控件实例。下面的行创建了products-add的一个新实例,该实例与ItemsSource="{绑定产品}"
ProductsAdd productsAddWindow = new ProductsAdd();