【问题标题】:Master-detail hierarchy between a ListBox and a DataGridListBox 和 DataGrid 之间的主从层次结构
【发布时间】:2013-05-06 01:31:42
【问题描述】:

我想根据 ListBox.SelectedItem 值设置 DataGrid.ItemsSource 属性,以便每当在 ListBox 中选择一个类别时,DataGrid 应该显示相应的集合。

例子:

ListBox 有以下项目:

  • 艺术家
  • 媒体

(取自此枚举)

public enum Category
{
    Artists,
    Medias
}

然后 DataGrid 应该从这里选择相关的集合:

public class MyCategories
{
    public IEnumerable<Media> Medias { get; set; }
    public IEnumerable<Artist> Artists { get; set; }
}

但是,DataGrid.ItemsSource 的 ConverterParameter 不允许为其定义绑定。

不能在“Binding”类型的“ConverterParameter”属性上设置“Binding”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。

    <DataGrid ItemsSource="{Binding Mode=OneWay,
              Converter={StaticResource categoriesConverter},
              ConverterParameter={Binding ElementName=listBox1, Path=SelectedItem}}" />

如何实现这一目标?

【问题讨论】:

  • 媒体和艺术家都是类?在枚举中,它们只是字符串。甚至是字典<string,IEnumerable>因为 IEnumerable 需要一个类型,所以不会起作用。
  • 是的,它们是类。

标签: wpf binding datagrid listbox


【解决方案1】:

一种方法是创建一个同时具有名称和 IEnumerable 的类
在您的情况下, IEnumerable 是一个类(不是字符串),并且在路径中您需要包含要显示的属性的名称

<Window x:Class="Waster13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0" ItemsSource="{Binding Path=EnumsPlus}" DisplayMemberPath="Name" x:Name="lbMaster"/>
        <ListBox Grid.Column="1" ItemsSource="{Binding ElementName=lbMaster, Path=SelectedItem.IEnum}" />
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections;

namespace Waster13
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private List<EnumPlus> enumsPlus = new List<EnumPlus>();
        public MainWindow()
        {
            this.DataContext = this;
            enumsPlus.Add(new Media("media1", new List<string>() { "m1", "m2" }));
            enumsPlus.Add(new Media("media2", new List<string>() { "m3", "m4" }));
            enumsPlus.Add(new Artist("artist1", new List<string>() { "a1", "a2" }));
            enumsPlus.Add(new Artist("artist2", new List<string>() { "a3", "a4" }));
            InitializeComponent();
        }
        public List<EnumPlus> EnumsPlus { get { return enumsPlus; } }
    }
    public interface EnumPlus : IEnumerable
    {
        String Name { get; }
    }
    public class Media : EnumPlus
    {
        private string name;
        private IEnumerable iEnum;
        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)iEnum.GetEnumerator();
        }
        public String Name { get { return name; } }
        public IEnumerable IEnum { get { return iEnum; } }

        public Media(string Name, IEnumerable IEnum)
        { name = Name; iEnum = IEnum; }
    }
    public class Artist : EnumPlus
    {
        private string name;
        private IEnumerable iEnum;
        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)iEnum.GetEnumerator();
        }
        public String Name { get { return name; } }
        public IEnumerable IEnum { get { return iEnum; } }

        public Artist(string Name, IEnumerable IEnum)
        { name = Name; iEnum = IEnum; }
    }
}

【讨论】:

  • 你怎么能选择 Path=SelectedItem.IEnum ? SelectedItem 之后什么都没有弹出,所以我必须创建一个 ValueConverter 来获取集合。请注意,我没有复制/粘贴您的代码,而是重新创建了类似的代码,第二个 ListBox 是一个 DataGrid,而 IEnumerable 是一个 IQueryable。
  • 因为 SelectedItem 有一个属性 IEnum。
  • 这很奇怪,我复制/粘贴了您的代码,但它仍然没有提供它。我知道他们应该被取走,但他们没有。我首先想到的是因为它在另一个程序集中并且没有公共无参数构造函数,但这并没有解决它。您使用什么版本的 WPF?我目前正在使用 WPF 4.5
  • 我在 4.0.但我无法想象它在 4.5 上坏了。你确实包括了使用 System.Collections;?
  • 是的,我做到了,这真的很奇怪,我一直在尝试但没有成功,SelectedItem 仍然是一个对象。我将创建一个新项目并重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2021-05-20
  • 2015-01-09
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多