c# - WPF 自定义网格控件

标签 c# wpf user-controls grid infragistics

我正在尝试找出一种方法来定义自定义用户控件,如下图所示:

enter image description here

第一列突出显示该行,第二列突出显示“内部行”,并且对于每个外部行,都应该有一个文本框字段,用户可以在其中输入数据。

我正在苦苦挣扎的是了解这是否可能。 我提出的所有解决方案都在第二个外行(TextField 2.1.1 所在的位置)上放置了另一个标签。

我能想到的最接近的是一个糟糕的模拟,它基本上归结为一个 ItemsControl 绑定(bind)到一个定义如下的 DataTemplate:

<ItemsControl  Name="SelectedSampleData"  Grid.Row="1" ItemsSource="{Binding SelectedSampleData}" ItemTemplate="{StaticResource DefaultTemplate}" />

<DataTemplate x:Key="DefaultTemplate">
    <Grid x:Name="GridItem" MaxWidth="{Binding ElementName=Container,Path=ActualWidth}" >
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Viewbox Height="20"  HorizontalAlignment="Left">
            <TextBlock Grid.Row="0" Text="{Binding Path=field1}" Margin="5,1,0,0" Background="LightBlue" />
        </Viewbox>
        <igDP:XamDataGrid Name="GridConsuntivi" Grid.Row="1" DataSource="{Binding Path=field2List}" Margin="25,0,0,0">
            <igDP:XamDataGrid.FieldLayouts>
                <igDP:FieldLayout Key="DefaultLayout">

                    <igDP:FieldLayout.Fields >

                        <igDP:Field Name="label1" IsReadOnly="True">
                            <igDP:Field.Settings>
                                <igDP:FieldSettings LabelTextWrapping="Wrap" LabelMaxWidth="100" AllowEdit="False" />
                            </igDP:Field.Settings>
                        </igDP:Field>

                        <igDP:Field Name="label2" IsReadOnly="True">
                            <igDP:Field.Settings>
                                <igDP:FieldSettings LabelTextWrapping="Wrap" LabelMaxWidth="70" AllowEdit="False" />
                            </igDP:Field.Settings>
                        </igDP:Field>

                        <igDP:Field Name="label3" IsReadOnly="True">
                            <igDP:Field.Settings>
                                <igDP:FieldSettings LabelTextWrapping="Wrap" LabelMaxWidth="70" AllowEdit="False" />
                            </igDP:Field.Settings>
                        </igDP:Field>

                        <igDP:Field Name="label3" IsReadOnly="True">
                            <igDP:Field.Settings>
                                <igDP:FieldSettings LabelTextWrapping="Wrap" LabelMaxWidth="95" AllowEdit="False" />
                            </igDP:Field.Settings>
                        </igDP:Field>

                        <igDP:Field Name="label4" IsReadOnly="True">
                            <igDP:Field.Settings>
                                <igDP:FieldSettings LabelTextWrapping="Wrap" LabelMaxWidth="180" AllowEdit="False" />
                            </igDP:Field.Settings>
                        </igDP:Field>

                    </igDP:FieldLayout.Fields>
                </igDP:FieldLayout>
            </igDP:XamDataGrid.FieldLayouts>

        </igDP:XamDataGrid>
        <TextBox Margin="25,10,0,0" AcceptsReturn="True"  MaxWidth="{Binding ElementName=parent,Path=ActualWidth}"  TextWrapping="Wrap" IsEnabled="True" Grid.Row="2" Text="{Binding Path=note}" />
        <Separator Grid.Row="3"/>
    </Grid>
</DataTemplate>

这样播放:

enter image description here

除了我认为可以通过一些艺术触觉(我没有)来解决的视觉丑陋之外,我讨厌有两个标题具有相同信息的事实。我希望它感觉像是一个统一的组件。

你有什么想法吗?

我正在考虑在 xamdatagrid 的标题可见性上放置某种转换器,如果它不是显示的第一行,它将隐藏它,但我试图避免这种巧妙的技巧。

如果有帮助,我正在使用 Infragistics。

提前致谢

最佳答案

内部行、未在标准列(您的文本字段)内对齐的组件和多个行标题将迫使您“劫持”DataGrid 的基本概念。我建议您在没有 DG 的情况下开发自己的用户控件。

否则,您将不得不重新定义整个 DataGrid 的模板,您肯定需要一些自定义行为/逻辑,因此您还需要扩展 DataGrid 控件本身。

下面这篇文章可以给你一个很好的切入点 https://www.codeproject.com/articles/586132/wpf-datagrid-custommization-using-style-and-templa

关于c# - WPF 自定义网格控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40887835/

相关文章:

c# - 无法将 LINQ 查询结果转换为 ToList

c# - WPF:当某个值更改时重新应用 DataTemplateSelector

c# - 在 WPF 中保存为 PDF

asp.net-mvc-4 - Razor 的三态复选框

c# - 创建出租车。集成紧凑框架的安装程序

c# - Console.WriteLine 慢

c# - 如何在 UserControl 中绑定(bind)集合依赖属性

c# - WPF C# - 复杂数据绑定(bind)

c# - 定时器事件处理程序不写在控制台上

c# - 多层应用程序中的依赖注入(inject)