【问题标题】:Set SelectedItem in a ComboBox在组合框中设置 SelectedItem
【发布时间】:2021-09-12 11:05:35
【问题描述】:

我试图在 ComboBox 中设置 SelectedItem 但没有任何成功。

如您在上面的屏幕截图中所见,它显示了产品列表中的第一条记录。

这是 XAML:

<ComboBox Grid.Column="1"
          Grid.Row="0"
          ItemsSource="{Binding Products}"
          SelectedItem="{Binding SelectedProduct, Mode=TwoWay}"
          IsSynchronizedWithCurrentItem="True"
          IsEditable="True"
          DisplayMemberPath="ProductName"
          SelectedValuePath="Id"
          Width="200"
          Height="30"
          VerticalContentAlignment="Center"
          Margin="10 0 0 20" />

视图模型:

public Product SelectedProduct
{
    get => _selectedProduct;
    set => Set(ref _selectedProduct, value);
}

我在这里设置了 SelectedProduct :

private void OrderUserControl(Order order)
{
    ShowOrderUserControl = Visibility.Visible;

    Products = _productService.GetProducts();

    if (order == null)
    {
        Order = new Order();

        OrderUserControlTitle = "Nieuwe bestelling toevoegen";
    }
    else
    {
        Order = order;

        SelectedProduct = _productService.GetProductById(Order.ProductId);

        OrderUserControlTitle = "Bestelling aanpassen";
    }
}

有什么想法吗?

【问题讨论】:

  • 当 Product 没有覆盖 Equals 方法时,您必须确保从 SelectedProduct 返回的对象是 Products 集合的一个元素。
  • 除此之外,设置 SelectedValuePath 是没有意义的,除非您还绑定 SelectedValue - 而不是 SelectedItem。

标签: c# wpf xaml combobox mvvm-light


【解决方案1】:

假设您的 Product 类有一个 Id 属性,

您可以像这样使用 linq 获取您的 SelectedProduct,而不是再次使用您的服务:

SelectedProduct = Products.Find(p => p.Id == Order.ProductId);

它确保您选择的产品是您Products 列表的一部分

【讨论】:

  • 或者(假设 Order 是具有更改通知的属性)您绑定 SelectedValue="{Binding Order.ProductId}" 而不是绑定 SelectedItem。
  • 成功了,但为什么它不能与我的服务一起使用?它还返回一个 Product 对象。 @Clemens 我也会试试的。
  • 查看我对这个问题的评论:“确保从 SelectedProduct 返回的对象是 Products 集合的元素” - 即不是 新的 集合中未包含的产品。
猜你喜欢
  • 2017-04-26
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2012-04-18
  • 2015-02-13
  • 2011-02-22
  • 1970-01-01
相关资源
最近更新 更多