gpt4 book ai didi

c# - WPF DataGridComboBoxColumn 不工作

转载 作者:行者123 更新时间:2023-11-30 14:25:33 24 4
gpt4 key购买 nike

我在 WPF 项目的 DataGrid 中有一个 DataGridComboBoxColumn 设置如下:

<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 是这样的:

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

Collection View 模型具有这些属性

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

我显示 Id 只是为了测试,将来会添加一个描述属性。

为什么 ComboBoxColumn 不起作用?

最佳答案

您的问题是由 DataGridColumns 引起的:确实是 do not belong to the visual tree ,因此您无法将它们的属性绑定(bind)到您的 DataContext

你可以找到here基于一种可卡住的“DataContext 代理”的解决方案,因为 Freezable 对象即使不在可视化树中也可以继承 DataContext

现在,如果您将此代理放在 DataGrid 的资源中,它可以绑定(bind)到 DataGridDataContext 并且可以使用 StaticResource 关键字检索。

所以你的 XAML 将变成:

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

proxy 是您的资源名称。

希望对您有所帮助。

编辑

我用从 link 复制的代码更新我的答案(因为@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>

关于c# - WPF DataGridComboBoxColumn 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37808855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com