C# 在后面有DataView的WPF DataGrid中,我们希望在单击之前将组合框显示为标签

C# 在后面有DataView的WPF DataGrid中,我们希望在单击之前将组合框显示为标签,c#,wpf,.net-4.0,wpfdatagrid,datagridcomboboxcolumn,C#,Wpf,.net 4.0,Wpfdatagrid,Datagridcomboboxcolumn,所以我们有一个WPF数据网格,在一些单元格中有一些组合框,其中有一个外部关系,但这意味着我们一次加载数百个组合框,这需要很长时间。我们想做的是加载一个标签,直到点击它,在这一点上一个组合框被加载,我们可以很容易地用一个文本框做到这一点 问题是,我们的组合框工作,允许用户通过从许多显示值(例如{Car,Dog,Cat})中选择来更改列中的外键值。但是在用户单击标签之前,标签会显示外键值本身(例如{1,2,3}) 我们能做些什么?非常感谢您的帮助 <DataGridTemplateColumn

所以我们有一个WPF数据网格,在一些单元格中有一些组合框,其中有一个外部关系,但这意味着我们一次加载数百个组合框,这需要很长时间。我们想做的是加载一个标签,直到点击它,在这一点上一个组合框被加载,我们可以很容易地用一个文本框做到这一点

问题是,我们的组合框工作,允许用户通过从许多显示值(例如{Car,Dog,Cat})中选择来更改列中的外键值。但是在用户单击标签之前,标签会显示外键值本身(例如{1,2,3})

我们能做些什么?非常感谢您的帮助

<DataGridTemplateColumn Header="Column Name" SortMemberPath="Column Name"> 
    <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate>
            <Label Content="{Binding Path=DataViewBehindColumnName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
           <ComboBox 
            DataContext="{DynamicResource ResourceKey=ViewModel}" 
            ItemsSource="{Binding Path=ReferenceTableName, 
                         Converter={StaticResource dataViewToListConverter}}" 
            DisplayMemberPath="ReferenceTableDisplayNamesColumn" 
            SelectedValuePath="ReferenceTablePrimaryKeyColumn" 
            SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, 
                           Path=Item[DataViewBehindColumnName]}"
            />
        </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

亲切问候,,
Fugu

每行创建一个ViewModel,并在其中提供一个表示已解析字符串值的属性和另一个表示键的属性。将labels内容属性绑定到string属性,将combobox SelectedValue绑定到key属性


不说MVVM:创建一个行项目包装器,其中包含datagrid所需的所有属性,包括一个包含问题属性的已解析字符串值的属性。

为每行创建一个ViewModel,并在其中提供一个表示已解析字符串值的属性和另一个表示键的属性。将labels内容属性绑定到string属性,将combobox SelectedValue绑定到key属性


不说MVVM:创建一个行项目包装器,它保存datagrid所需的所有属性,包括一个保存问题属性的已解析字符串值的属性。

当我阅读您的文章时,我想到了两件事

1) 数据网格虚拟化。这可以为您节省一些负载

2a)使用bool属性“ShowData”为数据对象构建代理。这在默认情况下为false,在单击控件时设置为true。您可以使用命令绑定来实现这一点。如果不使用ORM,则可以扩展数据集源代码并添加此功能。不过,这最终可能会是一大堆工作


2b)组合框有一个可编辑模板和一个不可编辑模板(你可以很容易地在混合中找到它们)。绑定不可编辑模板的内容以显示静态字符串,并将可编辑的字符串显示到关系中。这将仅在您尝试编辑selectedItem时显示您的关系。同样,如果你使用像NHibernate这样的ORM,你可以从懒散的加载特性中获益。

当我阅读你的文章时,我想到了两件事

1) 数据网格虚拟化。这可以为您节省一些负载

2a)使用bool属性“ShowData”为数据对象构建代理。这在默认情况下为false,在单击控件时设置为true。您可以使用命令绑定来实现这一点。如果不使用ORM,则可以扩展数据集源代码并添加此功能。不过,这最终可能会是一大堆工作


2b)组合框有一个可编辑模板和一个不可编辑模板(你可以很容易地在混合中找到它们)。绑定不可编辑模板的内容以显示静态字符串,并将可编辑的字符串显示到关系中。这将仅在您尝试编辑selectedItem时显示您的关系。同样,如果您使用像NHibernate这样的ORM,您可以从懒散加载特性中获益。

有没有办法做到这一点,这样我们就不必为每一个对外关系都实施ORM?假设每个表有15个外键。。。在我们的应用程序维护噩梦中,我们想允许编辑40个表?@Fugu:我没有足够的信息来回答这个问题。我认为有些人或包装商有能力为你做这样的事情。在我的例子中,我使用一个自编工具来创建这样的视图模型。也许你会得到一个答案,如果你张贴一个问题与您的或映射器的上下文。如果您不使用一个而是直接访问数据库或其他源,请考虑一个在抽象级别执行解析的帮助器类。非常感谢。我们没有做对象关系;由于某些数据提交要求,我们有后面的数据集和要绑定控件的数据视图。用于更改DataView筛选器的命令。用于需要列表而不是数据视图的控件的转换器。我不知道数据集,但据我所知,它们支持导航。因此,获得解析值可能不是什么大问题。对于VievModel,如果您有这么多的表,并且所有的表都完全不同,那么最好考虑基于索引的内容(可以在索引器上定义绑定)。这也是一个关于您的表有多稳定的问题(如果它们经常更改,或者是否会在多年内保持不变)…有没有办法做到这一点,这样我们就不必为每一个对外关系都实施?假设每个表有15个外键。。。在我们的应用程序维护噩梦中,我们想允许编辑40个表?@Fugu:我没有足够的信息来回答这个问题。我认为有些人或包装商有能力为你做这样的事情。在我的例子中,我使用一个自编工具来创建这样的视图模型。也许你会得到一个答案,如果你张贴一个问题与您的或映射器的上下文。如果您不使用一个而是直接访问数据库或其他源,请考虑一个在抽象级别执行解析的帮助器类。非常感谢。我们没有做对象关系;由于某些数据提交要求,我们有后面的数据集和要绑定控件的数据视图。用于更改DataView筛选器的命令。用于需要列表而不是数据视图的控件的转换器。我不知道数据集,但据我所知,它们支持导航。因此,获得解析值可能不是什么大问题。对于VievModel,如果您有这么多的表,并且所有的表都完全不同,那么精简可能是一个好主意