WPF DataGridComboBoxColumn不起作用

马特奥·布鲁尼(Matteo Bruni)

我有DataGridComboBoxColumn一个DataGridWPF项目中设置这样的:

<DataGridComboBoxColumn Header="Master" SelectedItemBinding="{Binding MasterId}" SelectedValueBinding="{Binding Id}" DisplayMemberPath="Id" ItemsSource="{Binding Masters}" />

但是当我运行项目时,该列仅显示空白值,并且处于编辑模式的组合框执行相同的操作。

DataGrid的设置如下:

<DataGrid Name="ReadersGrid"  Grid.Row="0" Grid.Column="0" Margin="3" ItemsSource="{Binding Readers}" CanUserAddRows="True" CanUserDeleteRows="True" AutoGenerateColumns="False">

和用户控件是这样的:

<UserControl x:Class="SmartAccess.Tabs.ReadersTab"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:SmartAccess.Tabs"
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" DataContext="{StaticResource ReadersListViewModel}">

其他列(仅文本)可以正常工作。

ViewModel具有这些属性

public ObservableCollection<ReaderViewModel> Readers { get; set; }
public IEnumerable<ReaderViewModel> Masters => Readers.Concat(new List<ReaderViewModel> { new ReaderViewModel { Id = -1 } }).OrderBy(t => t.Id);

集合viewmodel具有这些属性

public long Id { get; set; }
public long MasterId { get; set; }

Id显示用于测试,将来会添加一个description属性。

为什么ComboBoxColumn不起作用?

维克

您的问题是由DataGridColumns以下原因引起的:实际上,它们不属于视觉树,因此您不能将其属性绑定到您的DataContext

您可以在此处找到一种基于可冻结的“ DataContext代理”的解决方案,因为即使Freezable对象DataContext不在可视化树中,它们也可以继承

现在,如果你把这个代理中DataGrid的资源,它可以绑定在了DataGridDataContext,并且可以通过检索StaticResource关键字。

因此,您的XAML将变为:

<DataGridComboBoxColumn Header="Master" SelectedItemBinding="{Binding MasterId}"
    SelectedValueBinding="{Binding Id}" DisplayMemberPath="Id"
    ItemsSource="{Binding Data.Masters, Source={StaticResource proxy}}" />

proxy资源的名称在哪里

希望它能对您有所帮助。

编辑

我使用从此链接复制的代码更新答案(由于@icebat的评论)。这是BindingProxy课程:

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

然后,在XAML中,您需要添加:

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章