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

ObservableCollection依赖项属性未在Usercontrol上更新

问题是在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();