Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态填充WPF数据网格_C#_Wpf_Dynamic_Datagrid_Formatting - Fatal编程技术网

C# 动态填充WPF数据网格

C# 动态填充WPF数据网格,c#,wpf,dynamic,datagrid,formatting,C#,Wpf,Dynamic,Datagrid,Formatting,我的程序需要通过串行连接从火灾报警面板获取输入,并在此基础上填充列表。当从面板报告新设备时,将解析该语句并将该设备添加到设备列表中 我的程序的这一部分工作得很好。现在的问题是向用户显示火灾报警设备的列表 我希望使用DataGrid来实现这一点(除非有更好的方法?),但我无法找到很多与我相关的关于WPF DataGrids的有用文档。大部分显示的内容似乎都是来自数据库的数据。然而,我的需要在每次面板吐出新的设备描述和我的程序中的设备列表被追加时更新 我明白了,我可以将AutoGenerateCol

我的程序需要通过串行连接从火灾报警面板获取输入,并在此基础上填充列表。当从面板报告新设备时,将解析该语句并将该设备添加到设备列表中

我的程序的这一部分工作得很好。现在的问题是向用户显示火灾报警设备的列表

我希望使用DataGrid来实现这一点(除非有更好的方法?),但我无法找到很多与我相关的关于WPF DataGrids的有用文档。大部分显示的内容似乎都是来自数据库的数据。然而,我的需要在每次面板吐出新的设备描述和我的程序中的设备列表被追加时更新

我明白了,我可以将AutoGenerateColumns设置为true,并在最初显示我的列表。但是,我想自定义列标题。此外,当添加列表时,这不会更新,因此我不确定如何“刷新”它

当AutoGenerateColumns为false时,我不会显示任何数据。当程序运行时,它会显示与列表中的项目数相对应的正确行数,但不会显示任何数据。想知道如何/是否需要将每个列与其对应的设备数据成员链接

最后,如何格式化数据网格,使其在重新调整大小后看起来更漂亮?我可以设置列宽等等,但是我想要的是一些列的宽度是固定的,中间的列可以扩展以填充剩余的可用区域


这是我第一次尝试WPF。任何帮助都将不胜感激

这是一堆问题!我建议你在提问之前多做一些背景调查。我建议您阅读我不久前写的关于WPF DataGrid的这篇codeproject文章:


它将为您解答大多数问题

这是一堆问题!我建议你在提问之前多做一些背景调查。我建议您阅读我不久前写的关于WPF DataGrid的这篇codeproject文章:

它将为您解答大多数问题

看看这个模式,在创建这个应用程序时,它将是一个巨大的帮助

您需要的是ViewModel中的ObservableCollection。您将把datagrid的ItemsSource属性绑定到此集合。然后将列绑定到上的各种属性以显示它们。无论何时此ObservableCollection附加了一个项,前端都应该自动更新

要使列自动调整大小,请设置宽度=“*”

下面是一个带有MVVM的datagrid示例

<DataGrid ItemsSource="{Binding FireAlarmCollection}" SelectedItem="{Binding SelectedFireAlarm, Mode=TwoWay}" AutoGenerateColumns="True" CanUserSortColumns="True" HorizontalScrollBarVisibility="Visible" CanUserResizeColumns="True">
</DataGrid>

在您继续努力的过程中,为每个问题分别发布问题。

看看模式,这将对您创建此应用程序有很大帮助

您需要的是ViewModel中的ObservableCollection。您将把datagrid的ItemsSource属性绑定到此集合。然后将列绑定到上的各种属性以显示它们。无论何时此ObservableCollection附加了一个项,前端都应该自动更新

要使列自动调整大小,请设置宽度=“*”

下面是一个带有MVVM的datagrid示例

<DataGrid ItemsSource="{Binding FireAlarmCollection}" SelectedItem="{Binding SelectedFireAlarm, Mode=TwoWay}" AutoGenerateColumns="True" CanUserSortColumns="True" HorizontalScrollBarVisibility="Visible" CanUserResizeColumns="True">
</DataGrid>


在您继续努力的过程中,为每个问题发布单独的问题。

前不久我写了一篇文章看看,它将帮助您在像您这样的动态场景中创建数据网格。

前不久我写了一篇文章看看,它将帮助您在像您这样的动态场景中创建数据网格

我个人不太喜欢数据网格。是的,它们更容易绑定,并提供内置的调整大小和排序选项,但它们不如ItemsControl灵活,在对象上具有良好的数据模板。让我解释一下

我倾向于使用ObservableCollection填充ItemsControl。然后,我使用DataTemplate告诉我的ItemsControl如何显示自定义项

如果您正在执行MVVM,则CustomObjects可以是Modeles对象。 如果您的列表绑定到一个ObservableCollection,那么添加和删除的项目将动态地显示在您的列表中,我相信您正试图这样做。 对于列大小,可以将指定GridColumns width的网格放置为固定宽度(对于某些列)和*以填充其余空间

这里有一个GridView的替代方案 我在ItemControl周围使用滚动查看器,因此如果ItemsControl太大,您可以滚动它。 ItemsControl的ItemSource绑定到FireAlarms的ObservableCollection。 ItemsControl中的WrapPanel将包含每个DataTemplate。它的宽度绑定到其父级(或祖先,如果您愿意),这是一个ItemsControl

<ScrollViewer
    Grid.Row="x"
    Grid.Column="y"
    VerticalScrollBarVisibility="Auto"
    Margin="5">

    <ItemsControl
    BorderBrush="DarkBlue"
    BorderThickness="2"
    ItemsSource="{Binding Path=FireAlarms}"
    ItemTemplate="{StaticResource FireAlarmsTemplate}"
    >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel 
                        Orientation="Horizontal"
                        Width="{Binding RelativeSource=
                            {RelativeSource FindAncestor,
                            AncestorType={x:Type ItemsControl}},
                            Path=ActualWidth}"
                        >
                </WrapPanel>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</ScrollViewer>
以下是一个不错的数据模板:

<DataTemplate x:Key="FireAlarms">
    <Border 
        BorderBrush="SteelBlue" 
        Background="LightBlue" 
        BorderThickness="2" 
        Margin="10" 
        Padding="10">
        <StackPanel 
            Orientation="Vertical"
            >
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition Width="5"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>


                <Label 
                    Grid.ColumnSpan="3"
                    Grid.Row="0"
                    Content="{Binding Path=AlarmName}"
                    Margin="5,-5,5,10"
                    FontWeight="Bold"
                    FontSize="16"
                    HorizontalContentAlignment="Center"
                    HorizontalAlignment="Center">
                </Label>

                <TextBlock  
                    Text="Alarm information 1" Grid.Row="1" Grid.Column="0" />
                <TextBox 
                    Text="{Binding Path=AlarmInfo1}"
                    Grid.Column="2"
                    Grid.Row="1"
                    >
                </TextBox>

                <TextBlock 
                    Text="Alarm information 2" Grid.Row="2" Grid.Column="0" />
                <TextBox 
                    Text="{Binding Path=AlarmInfo2}"
                    Grid.Column="2"
                    Grid.Row="2"
                    >
                </TextBox>

                <TextBlock  
                    Text="Alarm information 3" Grid.Row="3" Grid.Column="0" />
                <TextBox 
                    Text="{Binding Path=AlarmInfo3}"
                    Grid.Column="2"
                    Grid.Row="3"
                    >
                </TextBox>
            </Grid>
        </StackPanel>
    </Border>
</DataTemplate>

好的,我希望这对你有用。我的模板将生成每个报警1平方米。如果你想把它放在一个像GridView这样的表格中,你可以使用一个垂直方向的堆栈面板来修改它,并使用一个列宽可变/不变的网格,但是既然你要求任何有用的东西,我就给你一些有趣的东西


享受吧

就个人而言,我不太喜欢DataGrid。是的,它们更容易绑定,并提供内置的调整大小和排序选项,但它们不如ItemsControl灵活,在对象上具有良好的数据模板。让我解释一下

我倾向于使用ObservableCollection填充ItemsControl。然后,我使用一个数据模板
GridViewDataColumn newColumn= new GridViewDataColumn();
myDataGrid.Columns.Add(newColumn)
 newColumn.Binding = new Binding("knownPropertyName");
 myDoubleCollection.Add(someDoubleValue); //do this for each item in the itemssource of the grid
   int index=myDoubleCollection.Count-1;
   newColumn.Binding = new Binding(string.Format("myDoubleCollection[{0}]",index));