1

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

问题是,我们的组合框工作并允许用户通过从多个显示值(例如 {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>

亲切的问候,河豚

4

2 回答 2

1

每行创建一个 ViewModel,并在其中提供一个表示已解析字符串值的属性和另一个表示键的属性。将标签 Content-property 绑定到 string-property,将组合框 SelectedValue 绑定到 key-property。

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

于 2011-08-09T10:05:39.033 回答
0

当我读到你的帖子时,我想到了两件事

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

2a) 使用布尔属性“ShowData”为您的 DataObjects 构建代理。默认情况下为 false,单击控件时设置为 true。您可以使用 commandBinding 来做到这一点。如果您不使用 ORM,则可以扩展 DataSet SourceCode 并添加此功能。不过,这最终可能会成为一大堆工作。

2b)组合框有一个可编辑模板和一个不可编辑模板(您可以在 Blend 中轻松找到它们)。绑定不可编辑模板的内容以显示静态字符串和可编辑的关系。这将仅在您尝试编辑 selectedItem 时显示您的关系。同样,如果您使用像 NHibernate 这样的 ORM,您可以从 LazyLoading 功能中受益。

于 2011-08-09T13:21:58.927 回答