WPF DataGridComboBoxColumn 不起作用

2023-12-10

我有一个DataGridComboBoxColumn in a DataGrid in a WPF项目设置如下:

<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);

集合视图模型具有这些属性

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

我正在显示Id仅用于测试,将来将添加描述属性。

为什么 ComboBoxColumn 不起作用?


您的问题是由以下原因引起的DataGridColumns: 确实是他们不属于视觉树,所以你不能将它们的属性绑定到你的DataContext.

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

现在,如果您将此代理放入DataGrid的资源,可以绑定DataGrid's DataContext并可以通过使用来检索StaticResource关键词。

所以你的 XAML 将变成:

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

Where proxy是您的资源的名称。

我希望它可以帮助你。

EDIT

我用从中复制的代码更新我的答案link(因为@icebat的评论)。这是BindingProxy class:

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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF DataGridComboBoxColumn 不起作用 的相关文章

随机推荐