【问题标题】:Nested Collections add problems嵌套集合添加问题
【发布时间】:2014-01-26 09:38:44
【问题描述】:

我正在尝试在 WPF 数据网格中显示一个带有类列表的类。

我有以下 XAML:

<Window x:Class="Main.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        FlowDirection="RightToLeft">
    <Grid>
        <DataGrid Height="auto" Width="auto" Name="DaveningTimes" CanUserAddRows="False" AutoGenerateColumns="False">
            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3"/>
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander>
                                            <Expander.Header>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Path=ItemCount}" Margin="8,0,4,0"/>
                                                    <TextBlock Text="{Binding Path=Name}" />
                                                </StackPanel>
                                            </Expander.Header>
                                            <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle> 
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding Alerts}" AutoGenerateColumns="False">
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding AlertTime.time, ValidatesOnExceptions=True, Mode=TwoWay}" Header="זמן" Width="auto"/>
                            <DataGridTemplateColumn Header="קובץ התראה" MinWidth="300">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <Grid>
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="auto" />
                                            </Grid.ColumnDefinitions>
                                            <TextBox Text="{Binding AlertProgram, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" IsEnabled="False" Grid.Column="0" x:Name="PathToFile"/>
                                            <Button Content="..." Grid.Column="1" Click="Button_browse_alert_program" />
                                        </Grid>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding DaveningTime}" Header="זמן תפילה" IsReadOnly="True"/>
                <DataGridTextColumn Binding="{Binding DaveningName}" Header="סוג תפילה" IsReadOnly="True"/>
                <DataGridCheckBoxColumn Binding="{Binding ToAlert}" Header="להתריע?" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

背后的代码:

IList<Davening> prayes;
public ICollectionView prayes_view { get; private set; }


public MainWindow()
{ 
    prayes = getPrayers(getHTMLfromURL()).ToList();
    InitializeComponent();


    prayes_view = new ListCollectionView(prayes.ToList());
    prayes_view.GroupDescriptions.Add(new PropertyGroupDescription("DaveningName"));
    prayes_view.CollectionChanged += prayes_view_CollectionChanged;
    DaveningTimes.ItemsSource = prayes_view;
}

getPrayers(getHTMLfromURL()) 从互联网上获取我正在显示的数据。

我使用的类如下图所示:

问题:

用户在行详细信息中的数据网格中添加列会添加项目,但所有值都是null。此外,验证似乎不起作用(没有红色标记或类似的东西)

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    作为一种好的做法,您可以尝试使用 XAML 的子元素来仅呈现该特定信息。然后,您应该将它们组合成更大的对象。这对于深层结构可以更好地扩展,并且 XAML 的复杂性/嵌套不会受到影响。它还有其他好处:

    • 以孤立的方式仅渲染嵌套的部分;
    • 在其他嵌套中渲染同一块;
    • 从嵌套类型中抽象出嵌套类型;
    • 使用 AJAX 更容易实现一些复杂的 GUI 范例(如“概览、缩放、按需详细信息”)。

    也许这会有所帮助:How to place an XAML usercontrol in a grid。 一旦你减少了问题,调试它也应该容易得多。

    【讨论】:

    • 感谢您的建议,但这并不能回答问题。如果您可以在评论中链接到有关该主题的几篇文章...
    猜你喜欢
    • 2022-01-24
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多