gpt4 book ai didi

wpf - 绑定(bind)到 CompositeCollection 时,ComboBox 未选择正确的项目

转载 作者:行者123 更新时间:2023-12-01 01:08:27 26 4
gpt4 key购买 nike

我有一个绑定(bind)到动物集合的组合框。我从中选择了我最喜欢的动物。我需要绑定(bind)项目上方的静态空项目。我使用 CompositeCollection 声明它。当 ComboBox 被绑定(bind)时 不选择我最初最喜欢的动物。我该如何解决? 类似问题 here但仍未解决。

观察:

  • 绑定(bind)到静态项目有效,即如果我没有最初最喜欢的动物,则选择静态项目。
  • 如果删除静态项目,问题就会消失。当然,这会使 CompositeCollection 和整个问题过时。

  • 我已经应用了这些措施:
  • CollectionContainer 不能直接绑定(bind)到所概述的属性 here .
  • 复合集合也按照建议移动到静态资源 here .

  • 完整的 C# 代码和 XAML 来演示问题:
    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;

    namespace WpfApplication1
    {
    public class Animal
    {
    public int Id { get; set; }
    public string Name { get; set; }
    }

    public class Zoo
    {
    private IEnumerable<Animal> _animals = new Animal[]
    {
    new Animal() { Id = 1, Name = "Tom" },
    new Animal() { Id = 2, Name = "Jerry" }
    };

    public Zoo(int initialId)
    {
    FavouriteId = initialId;
    }

    public int FavouriteId { get; set; }
    public IEnumerable<Animal> Animals { get { return _animals; } }
    }

    public partial class MainWindow : Window
    {
    public MainWindow()
    {
    InitializeComponent();
    }

    private void BindComboBox(object sender, RoutedEventArgs e)
    {
    // Selecting the static item by default works.
    //DataContext = new Zoo(-1);

    // Selecting "Jerry" by default does not work.
    DataContext = new Zoo(2);
    }
    }
    }

    XAML
    <Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1">

    <Window.Resources>
    <CollectionViewSource x:Key="AnimalsBridge" Source="{Binding Path=Animals}" />

    <CompositeCollection x:Key="AnimalsWithNullItem">
    <local:Animal Id="-1" Name="Pick someone..."/>
    <CollectionContainer Collection="{Binding Source={StaticResource AnimalsBridge}}" />
    </CompositeCollection>
    </Window.Resources>

    <StackPanel>
    <Button Content="Bind" Click="BindComboBox"/>

    <ComboBox x:Name="cmbFavourite"
    SelectedValue="{Binding Path=FavouriteId}"
    SelectedValuePath="Id" DisplayMemberPath="Name"
    ItemsSource="{StaticResource AnimalsWithNullItem}"/>
    </StackPanel>
    </Window>

    最佳答案

    我没有解决您的问题的方法,而是另一种方法。我个人有专用于每个 View 的 View 模型。然后我会在 View 模型上有一个属性来根据需要添加空值。我不喜欢这种方法,因为它可以更好地对我的 View 模型进行单元测试。

    对于您的示例添加:

    public class ZooViewModel
    {
    .....


    public IEnumerable<Animal> Animals { get { return _animals; } }
    public IEnumerable<Animal> AnimalsWithNull { get { return _animals.WithDefault(new Animal() { Id = -1, Name = "Please select one" }); } }
    }

    神奇的成分
    public static class EnumerableExtend {

    public static IEnumerable<T> WithDefault<T>(this IEnumerable<T> enumerable,T defaultValue) {
    yield return defaultValue;
    foreach (var value in enumerable) {
    yield return value;
    }
    }
    }

    然后在您的 XAML 中,您只需绑定(bind)到
    ComboBox x:Name="cmbFavourite"
    SelectedValue="{Binding Path=FavouriteId}"
    SelectedValuePath="Id" DisplayMemberPath="Name"
    ItemsSource="{Binding AnimalsWithNull }"/>

    现在您直接绑定(bind)到源并且可以正常控制绑定(bind)。还要注意,因为我们使用的是“yield”,所以我们不是创建一个新的枚举,而是迭代现有的列表。

    关于wpf - 绑定(bind)到 CompositeCollection 时,ComboBox 未选择正确的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838338/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com