我有DataGridComboBoxColumn
一个DataGrid
在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);
集合viewmodel具有这些属性
public long Id { get; set; }
public long MasterId { get; set; }
我Id
仅显示用于测试,将来会添加一个description属性。
为什么ComboBoxColumn不起作用?
您的问题是由DataGridColumns
以下原因引起的:实际上,它们不属于视觉树,因此您不能将其属性绑定到您的DataContext
。
您可以在此处找到一种基于可冻结的“ DataContext代理”的解决方案,因为即使Freezable
对象DataContext
不在可视化树中,它们也可以继承。
现在,如果你把这个代理中DataGrid
的资源,它可以绑定在了DataGrid
的DataContext
,并且可以通过检索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] 删除。
我来说两句