草庐IT

c# - 多个 ItemsSource 集合绑定(bind)

coder 2024-05-27 原文

如何将多个不同类型的集合绑定(bind)到 ItemsControl 的 ItemsSource?

使用单一绑定(bind)效果很好:

<ItemsControl ItemsSource="{Binding Foo}" />

但是当我尝试 CompositeCollection 时,Foo 中的项目没有显示:

    <ItemsControl>
        <ItemsControl.ItemsSource>
            <CompositeCollection>
                <CollectionContainer Collection="{Binding Foo}" />
            </CompositeCollection>
        </ItemsControl.ItemsSource>
    </ItemsControl>

最佳答案

我建议将 ListBox 绑定(bind)到您在代码中构建的 CompositeCollection。 在此示例中,我使用的是 ViewModel,但您也可以在代码隐藏中执行相同的操作。 您可以通过谷歌找到许多关于如何为 ViewModel 实现 ViewModelBase 和 DelegateCommand 的示例。

下面是这个例子的分解:

  • 此示例将 Customer 和 Person 对象加载到两个 ObservableCollection 容器中以支持修改集合。
  • ListBox 将其 ItemsSource 绑定(bind)到包含两个 ObservableCollection 的 CompositeCollection (ObjectCollection)。
  • ListBox 还将其 SelectedItem 绑定(bind)到一个对象 (SelectedObject) 以支持两种基本类型。
  • Button 添加了一个新的 Person 以表明您可以修改 CompositeCollection。
  • 为了完整性,我在最后添加了 Customer 和 Person 定义。

这是 View :

<Window x:Class="StackOverflow.Views.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Main Window" Height="400" Width="800">
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <ListBox Grid.Row="0" 
             SelectedItem="{Binding Path=SelectedObject}"
             ItemsSource="{Binding Path=ObjectCollection}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding FirstName}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Grid.Row="1" Content="Add Person" Command="{Binding Path=AddPerson}"/>
  </Grid>
</Window>

这是 View 模型:

using System.Collections.Generic;
using System.Windows.Data;
using System.Windows.Input;
using ContextMenuNotFiring.Commands;
using ContextMenuNotFiring.Models;

namespace StackOverflow.ViewModels
{
  public class MainViewModel : ViewModelBase
  {
    public MainViewModel()
    {
      AddPerson = new DelegateCommand<object>(OnAddPerson, CanAddPerson);

      CollectionContainer customers = new CollectionContainer();
      customers.Collection = Customer.GetSampleCustomerList();

      CollectionContainer persons = new CollectionContainer();
      persons.Collection = Person.GetSamplePersonList();

      _oc.Add(customers);
      _oc.Add(persons);
    }

    private CompositeCollection _oc = new CompositeCollection();
    public CompositeCollection ObjectCollection
    {
      get { return _oc; }
    }

    private object _so = null;
    public object SelectedObject
    {
      get { return _so; }
      set
      {
       _so = value;
      }
    }

    public ICommand AddPerson { get; set; }
    private void OnAddPerson(object obj)
    {
      CollectionContainer ccItems = _oc[1] as CollectionContainer;
      if ( ccItems != null )
      {
        ObservableCollection<Person> items = ccItems.Collection as ObservableCollection<Person>;
        if (items != null)
        {
          Person p = new Person("AAAA", "BBBB");
          items.Add(p);
        }
      }
    }

    private bool CanAddPerson(object obj)
    {
      return true;
    }
  }
}

模型如下:

public class Customer
{
  public String FirstName { get; set; }
  public String LastName { get; set; }

  public Customer(String firstName, String lastName)
  {
     this.FirstName = firstName;
     this.LastName = lastName;
  }

  public static ObservableCollection<Customer> GetSampleCustomerList()
  {
    return new ObservableCollection<Customer>(new Customer[4] {
            new Customer("Charlie", "Zero"), 
            new Customer("Cathrine", "One"),
            new Customer("Candy", "Two"),
            new Customer("Cammy", "Three")
        });
  }
}


public class Person
{
  public String FirstName { get; set; }
  public String LastName { get; set; }

  public Person(String firstName, String lastName)
  {
     this.FirstName = firstName;
     this.LastName = lastName;
  }

  public static ObservableCollection<Person> GetSamplePersonList()
  {
    return new ObservableCollection<Person>(new Person[4] {
            new Person("Bob", "Smith"), 
            new Person("Barry", "Jones"),
            new Person("Belinda", "Red"),
            new Person("Benny", "Hope")
        });
  }
}

关于c# - 多个 ItemsSource 集合绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5445790/

有关c# - 多个 ItemsSource 集合绑定(bind)的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  5. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  6. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  7. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  8. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  9. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  10. ruby-on-rails - before_filter 运行多个方法 - 2

    是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

随机推荐