首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF SharedSizeGroup没有正确地调整

WPF SharedSizeGroup没有正确地调整
EN

Stack Overflow用户
提问于 2020-05-29 18:59:54
回答 1查看 198关注 0票数 1

在我的应用程序中,我有两个类:DataObjSubDataObj。对于这两个类,我想要创建一个ListView,在其中我可以编辑两个类的对象。DataObj持有一个List<SubDataObj>,一些数据修改会对SubDataObj属性产生影响。

我的方法是像这样构建UI:

结构如下:

但是我不能对齐视图的三个部分的边框,我也不知道我做错了什么。

父网格具有Grid.IsSharedSizeScope="True"和所有ColumnDefinitions,在Grid中表示headers的网格和ListView.DataTemplate使用SharedSizeGroup="xxx"中的网格。

我的XAML代码如下所示:

代码语言:javascript
复制
<UserControl
    x:Class="SharedSizeGroupSandBox.Views.SharedSizeGroupView"
    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:SharedSizeGroupSandBox.Views"
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
    xmlns:models="clr-namespace:SharedSizeGroupSandBox.Models.SharedSizeGroup"
    xmlns:vms="clr-namespace:SharedSizeGroupSandBox.ViewModels"
    xmlns:converter="clr-namespace:SharedSizeGroupSandBox.ValueConverter"
    mc:Ignorable="d"
    d:DesignHeight="450"
    d:DesignWidth="800"
    d:DataContext="{x:Type vms:SharedSizeGroupVM}">
    <UserControl.Resources>
        <ResourceDictionary>
            <converter:BoolNotConverter
                x:Key="BoolNotConverter" />

            <Style
                x:Key="baseAlignStyle"
                TargetType="FrameworkElement">
                <Setter
                    Property="HorizontalAlignment"
                    Value="Stretch" />
                <Setter
                    Property="VerticalAlignment"
                    Value="Center" />
            </Style>
            <Style
                x:Key="baseBorderStyle"
                TargetType="Border"
                BasedOn="{StaticResource baseAlignStyle}">
                <Setter
                    Property="Margin"
                    Value="0,0" />
            </Style>
            <Style
                x:Key="headerBorderStyle"
                TargetType="Border"
                BasedOn="{StaticResource baseBorderStyle}">
                <Setter
                    Property="BorderBrush"
                    Value="Black" />
                <Setter
                    Property="VerticalAlignment"
                    Value="Stretch" />
                <Setter
                    Property="BorderThickness"
                    Value="0,0,1,0" />
            </Style>
            <Style
                TargetType="FrameworkElement"
                x:Key="baseMargingStyle"
                BasedOn="{StaticResource baseAlignStyle}">
                <Setter
                    Property="Margin"
                    Value="3" />
            </Style>
            <Style
                x:Key="textBlockHeaderStyle"
                TargetType="{x:Type TextBlock}"
                BasedOn="{StaticResource baseMargingStyle}">
                <Setter
                    Property="TextAlignment"
                    Value="Center" />

            </Style>
            <Style
                x:Key="checkBoxStyle"
                TargetType="CheckBox"
                BasedOn="{StaticResource baseMargingStyle}">
                <Setter
                    Property="HorizontalAlignment"
                    Value="Center" />
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>

    <!--#endregion  Buttons-->
    <ScrollViewer
        Grid.Row="1"
        HorizontalAlignment="Stretch"
        Grid.IsSharedSizeScope="True"
        HorizontalScrollBarVisibility="Auto">
        <Grid
            Grid.Row="1"
            HorizontalAlignment="Left"
            Margin="0">
            <Grid.RowDefinitions>
                <RowDefinition
                    Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <!--#region  Headers-->
            <Grid
                Margin="0,0,0,0"
                Grid.Row="0"
                HorizontalAlignment="Left"
                x:Name="grdlistHeader">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition
                        SharedSizeGroup="a" />
                    <ColumnDefinition
                        SharedSizeGroup="b" />
                    <ColumnDefinition
                        SharedSizeGroup="c" />
                    <ColumnDefinition
                        SharedSizeGroup="d" />
                    <ColumnDefinition
                        SharedSizeGroup="e" />
                    <ColumnDefinition
                        Width="Auto"
                        SharedSizeGroup="f" />
                </Grid.ColumnDefinitions>
                <Border
                    Style="{StaticResource headerBorderStyle}">
                    <TextBlock
                        Text="{Binding NameText}"
                        Style="{StaticResource textBlockHeaderStyle}" />
                </Border>
                <Border
                    Style="{StaticResource headerBorderStyle}"
                    Grid.Column="1">
                    <TextBlock
                        Text="{Binding DescriptionText}"
                        Style="{StaticResource textBlockHeaderStyle}" />
                </Border>
                <Border
                    Style="{StaticResource headerBorderStyle}"
                    Grid.Column="2">
                    <TextBlock
                        Text="{Binding MandatoryText}"
                        Style="{StaticResource textBlockHeaderStyle}" />
                </Border>
                <Border
                    Style="{StaticResource headerBorderStyle}"
                    Grid.Column="3">
                    <TextBlock
                        Text="{Binding ObsoleteText}"
                        Style="{StaticResource textBlockHeaderStyle}" />
                </Border>
                <Border
                    Style="{StaticResource headerBorderStyle}"
                    Grid.Column="4">
                    <TextBlock
                        Text="{Binding CountryText}"
                        Style="{StaticResource textBlockHeaderStyle}" />
                </Border>
                <TextBlock
                    Grid.Column="5"
                    Text="{Binding CityText}"
                    Style="{StaticResource textBlockHeaderStyle}" />
            </Grid>

            <!--#endregion  Headers-->
            <ListView
                Margin="0,0,0,0"
                Padding="0"
                Grid.Row="1"
                BorderThickness="0,0,0,0"
                BorderBrush="Black"
                SelectionMode="Single"
                SelectedItem="{Binding SelectedItem}"
                ItemsSource="{Binding Data}"
                HorizontalAlignment="Stretch"
                ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                ScrollViewer.VerticalScrollBarVisibility="Hidden">
                <ListView.ItemContainerStyle>
                    <Style
                        TargetType="ListViewItem">
                        <Setter
                            Property="HorizontalAlignment"
                            Value="Stretch" />
                        <Setter
                            Property="Padding"
                            Value="0" />
                        <Setter
                            Property="Margin"
                            Value="0" />
                        <Setter
                            Property="BorderThickness"
                            Value="0,1,0,0" />
                        <Setter
                            Property="BorderBrush"
                            Value="Black" />
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.ItemTemplate>
                    <DataTemplate
                        DataType="{x:Type vms:DataObjVM}">
                        <Grid
                            Margin="0">
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <!--#region  DataObjVMs-->
                            <Grid
                                Margin="0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition
                                        SharedSizeGroup="a"
                                        Width="Auto" />
                                    <ColumnDefinition
                                        SharedSizeGroup="b" />
                                    <ColumnDefinition
                                        SharedSizeGroup="c" />
                                    <ColumnDefinition
                                        SharedSizeGroup="d" />
                                    <ColumnDefinition
                                        SharedSizeGroup="e" />
                                    <ColumnDefinition
                                        SharedSizeGroup="f" />
                                    <ColumnDefinition
                                        SharedSizeGroup="g" />
                                    <ColumnDefinition
                                        SharedSizeGroup="h" />
                                    <ColumnDefinition
                                        SharedSizeGroup="i" />
                                </Grid.ColumnDefinitions>
                                <Border
                                    Style="{StaticResource headerBorderStyle}"
                                    Grid.Column="0">
                                    <TextBox
                                        Text="{Binding Path=Data.Name, UpdateSourceTrigger=PropertyChanged}"
                                        IsReadOnly="{Binding Path=Obsolete}"
                                        Style="{StaticResource baseMargingStyle}"
                                        Padding="0" />
                                </Border>
                                <Border
                                    Style="{StaticResource headerBorderStyle}"
                                    Grid.Column="1">
                                    <TextBox
                                        Text="{Binding Path=Data.Description}"
                                        IsReadOnly="{Binding Path=Obsolete}"
                                        Style="{StaticResource baseMargingStyle}" />
                                </Border>
                                <Border
                                    Style="{StaticResource headerBorderStyle}"
                                    Grid.Column="2">
                                    <CheckBox
                                        IsEnabled="{Binding Path=Obsolete, Converter={StaticResource BoolNotConverter}}"
                                        IsChecked="{Binding Path=Data.Mandatory}"
                                        Style="{StaticResource checkBoxStyle}" />
                                </Border>
                                <Border
                                    Style="{StaticResource headerBorderStyle}"
                                    Grid.Column="3">
                                    <CheckBox
                                        x:Name="cbObsolete"
                                        IsChecked="{Binding Path=Obsolete}"
                                        Style="{StaticResource checkBoxStyle}" />
                                </Border>
                                <Border
                                    Style="{StaticResource headerBorderStyle}"
                                    Grid.Column="4">
                                    <ComboBox
                                        Style="{StaticResource baseMargingStyle}"
                                        ItemsSource="{Binding Countries}"
                                        SelectedItem="{Binding Data.Country}"
                                        DisplayMemberPath="ExternalName"
                                        IsEnabled="{Binding Obsolete, Converter={StaticResource BoolNotConverter}}" />
                                </Border>
                                <ComboBox
                                    Grid.Column="5"
                                    Style="{StaticResource baseMargingStyle}"
                                    ItemsSource="{Binding Data.Country.Cities}"
                                    SelectedItem="{Binding Data.City}"
                                    DisplayMemberPath="ExternalName"
                                    IsEnabled="{Binding Obsolete, Converter={StaticResource BoolNotConverter}}" />
                            </Grid>
                            <!--#endregion  Temmplates-->
                            <!--#region  SubTemmplates-->
                            <ListView
                                Margin="0,0,0,0"
                                BorderThickness="0"
                                ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                                ScrollViewer.VerticalScrollBarVisibility="Hidden"
                                IsEnabled="{Binding IsEditEnabled}"
                                Padding="0"
                                Grid.Row="1">
                                <ListView.Resources>
                                    <CollectionViewSource
                                        x:Key="SubDataObjs">
                                        <CollectionViewSource.Source>
                                            <Binding
                                                Path="Data.SubDataObjs"
                                                Mode="OneWay"
                                                UpdateSourceTrigger="PropertyChanged" />
                                        </CollectionViewSource.Source>
                                        <CollectionViewSource.SortDescriptions>
                                            <scm:SortDescription
                                                PropertyName="Name"
                                                Direction="Ascending" />
                                        </CollectionViewSource.SortDescriptions>
                                    </CollectionViewSource>
                                </ListView.Resources>
                                <ListView.ItemContainerStyle>
                                    <Style
                                        TargetType="ListViewItem">
                                        <Setter
                                            Property="HorizontalAlignment"
                                            Value="Stretch" />
                                        <Setter
                                            Property="Padding"
                                            Value="0" />
                                        <Setter
                                            Property="Margin"
                                            Value="0" />
                                        <Setter
                                            Property="BorderThickness"
                                            Value="0,1,0,0" />
                                        <Setter
                                            Property="BorderBrush"
                                            Value="Black" />
                                    </Style>
                                </ListView.ItemContainerStyle>
                                <ListView.ItemsSource>
                                    <Binding
                                        Source="{StaticResource SubDataObjs}" />
                                </ListView.ItemsSource>
                                <ListView.ItemTemplate>
                                    <DataTemplate
                                        DataType="{x:Type models:SubDataObj}">
                                        <Grid
                                            Margin="0">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition
                                                    SharedSizeGroup="a" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="b" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="c" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="d" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="e" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="f" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="g" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="h" />
                                                <ColumnDefinition
                                                    SharedSizeGroup="i" />
                                            </Grid.ColumnDefinitions>

                                            <Border
                                                Style="{StaticResource headerBorderStyle}">
                                                <TextBox
                                                    Style="{StaticResource baseMargingStyle}"
                                                    Text="{Binding Path=Name}"
                                                    IsReadOnly="{Binding Path=Obsolete}"
                                                    MaxLength="{Binding MaxNameLength}" />
                                            </Border>
                                            <Border
                                                Style="{StaticResource headerBorderStyle}"
                                                Grid.Column="1">
                                                <TextBox
                                                    Style="{StaticResource baseMargingStyle}"
                                                    IsReadOnly="{Binding Path=Obsolete}"
                                                    BorderThickness="1"
                                                    Text="{Binding Path=Description}" />
                                            </Border>
                                            <Border
                                                Style="{StaticResource headerBorderStyle}"
                                                Grid.Column="2"
                                                Padding="0, 0,0,0">
                                                <CheckBox
                                                    IsEnabled="{Binding Path=Obsolete, Converter={StaticResource BoolNotConverter}}"
                                                    IsChecked="{Binding Path=Mandatory}"
                                                    Style="{StaticResource checkBoxStyle}" />
                                            </Border>
                                            <Border
                                                Style="{StaticResource headerBorderStyle}"
                                                Grid.Column="3">
                                                <CheckBox
                                                    IsChecked="{Binding Path=Obsolete}"
                                                    IsEnabled="{Binding ElementName=cbObsolete, Path=IsChecked, Converter={StaticResource BoolNotConverter}}"
                                                    Style="{StaticResource checkBoxStyle}" />
                                            </Border>
                                            <Border
                                                Style="{StaticResource headerBorderStyle}"
                                                Grid.Column="4" />
                                        </Grid>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                            <!--#endregion  SubTemmplates-->
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>

            </ListView>
        </Grid>
    </ScrollViewer>
</UserControl>

我已经编写了一个完整的工作沙箱应用,以防XAML本身不够。

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2020-05-31 02:09:04

创建一个同时包含DataObjSubDataObj的集合。

加载数据时,循环遍历每个DataObj,并为每个SubDataObj添加自身及其所有的SubDataObj到整个列表中。然后,您可以使用普通的ListView和普通的GridView,并使用整个列表作为ItemsSource

至于这种“整体收藏”的类型,我认为有三种选择:

  • DataObjSubDataObj显然共享一些属性(因为它们都可以在同一个网格中显示),因此它们从同一个基类继承或从另一个基类继承可能是有意义的。然后您可以使用SomeCollection<BaseDataObj> (例如)。
  • 如果继承不合适,请让它们实现包含它们的共享属性的相同接口。然后使用SomeBaseCollection<IDataInterface> (例如)。
  • 如果出于某种原因,您不想做上述任何一件事,只需使用List<Object>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62092973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档