DataGridComboBoxColumn不显示ObservableCollection [英] DataGridComboBoxColumn does not display ObservableCollection

查看:55
本文介绍了DataGridComboBoxColumn不显示ObservableCollection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

示例代码:

class GameListViewModel {
    private IGameRepository repository;
    public GameViewModel GameViewModel { get; set; }
    public ObservableCollection<GameViewModel> Games { get; set; }
    public ObservableCollection<GenreViewModel> Genres { get; set; }
    public ICommand AddGame_ { get; set; }

    public GameListViewModel() {
        repository = new DummyGameRepository();
        GameViewModel = new GameViewModel();
        Games = new ObservableCollection<GameViewModel>(repository.GameList().Select(game => new GameViewModel(game)));
        Genres = new ObservableCollection<GenreViewModel>(repository.GameList().Select(game => game.Genre).Distinct().Select(genre => new GenreViewModel(genre)));
        AddGame_ = new RelayCommand(AddGame, CanAddGame);
    }
}

class Game {
    public string Title { get; set; }
    public string SubTitle { get; set; }
    public int Pegi { get; set; }
    public Genre Genre { get; set; }
}

XAML:

    <DataGrid ItemsSource="{Binding Games}" AutoGenerateColumns="False" Margin="0,32">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Title" Binding="{Binding Title}" />
            <DataGridTextColumn Header="Sub-Title" Binding="{Binding SubTitle}" />
            <DataGridTextColumn Header="Pegi" Binding="{Binding Pegi}" />
            <DataGridTextColumn Header="Genre" Binding="{Binding Genre.Name}" />

            <DataGridComboBoxColumn Header="Test" ItemsSource="{Binding Genres}" DisplayMemberPath="Name" />
        </DataGrid.Columns>
    </DataGrid>

问题是,我希望组合框动态显示添加到游戏中的所有可能类型.为此,我在GameListViewModel中创建了一个ObservableCollection.这是行不通的!我已经为此苦苦挣扎了2个小时……后来,我希望选定的值成为游戏中的流派.

The problem is, I want the combobox to show all the possible genres added to games, dynamically. For that I have created a ObservableCollection within GameListViewModel. It does not work! I have been struggling with this now for 2 hours... Later I want the selected value to be the Genre within the Game.

推荐答案

啊,您发现了许多WPF开发人员的成功之源-DataGrid不会将其DataContext转发到各列.您不能真正依赖该列中的ItemsSource = {Binding Genres}之类的语句,因为框架无法解决它.这很烦人.

Ahhh, you have discovered the source of many WPF developer's fustrations - the DataGrid does not forward it's DataContext to the columns. You can't really rely on statements like ItemsSource={Binding Genres}" in the column, because the framework can't resolve it. It's super-annoying.

此外,您还没有设置SelectedItemBinding-这是一个有效的示例:

Also, you have not set your SelectedItemBinding - here is a working example:

xaml:

<Window x:Class="WpfApplication2.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.Resources>
        <CollectionViewSource Source="{Binding Possibilities}" x:Key="possibilities"/>
    </Grid.Resources>

    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" x:Name="dataGrid">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="test" 
                                    SelectedItemBinding="{Binding Selection}"
                                    ItemsSource="{Binding Source={StaticResource possibilities} }">

            </DataGridComboBoxColumn>

        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>

cs代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel()
        {
            Items = new ObservableCollection<Item>()
            {
                new Item(){
                    Selection ="A"
                }
            }
        };
    }
}

public class Item : ViewModelBase
{
    private string _selection = null;

    public string Selection
    {
        get { return _selection; }
        set { _selection = value; OnPropertyChanged("Selection"); }
    }
}

public class ViewModel : ViewModelBase
{
    private ObservableCollection<Item> _items = new ObservableCollection<Item>();

    public ObservableCollection<Item> Items
    {
        get { return _items; }
        set { _items = value; OnPropertyChanged("Items"); }
    }

    private ObservableCollection<string> _possibilities = new ObservableCollection<string>()
    {
        "A", "B", "C"
    };

    public ObservableCollection<string> Possibilities
    {
        get
        {
            return _possibilities;
        }
        set
        {
            _possibilities = value;
            OnPropertyChanged("Possibilites");
        }
    }
}

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        var propChanged = PropertyChanged;
        if (propChanged != null)
            propChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

以下是一些有用的链接:这应该工作: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

Here are some helpful links: this one should work: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

此处显示的最后一个解决方案特别相关: http://blogs.msdn.com/b/vinsibal/archive/2008/12/17/wpf-datagrid-dynamicly-updating-datagridcomboboxcolumn.aspx

the last solution shown here is particularly relevant: http://blogs.msdn.com/b/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx

这篇关于DataGridComboBoxColumn不显示ObservableCollection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆