【问题标题】:WPF - MVVM - How to realize a structure similar to the attached imageWPF - MVVM - 如何实现类似于附图的结构
【发布时间】:2019-08-05 14:12:44
【问题描述】:

我的应用程序监控与不同硬件通道相关的数据。每个频道都在读取一个名为标签的项目列表。每个标签由一个数字 ID、一个表示其有效性的布尔值和一个三字节数组组成。

我的模型目前制作如下:

public class ArincLabel
{
    public byte Label { get; set; }
    public byte[] Content { get; set; }
}

public class ArincLabelRx
{
    public bool IsValid { get; set; }
    public ArincLabel ArincLabel { get; set; }
}

public Dictionary<string, List<ArincLabelRx>> Arinc429RxData;

每次读取一批新标签时,ViewModel 都会引发并使用一个事件。

我需要向最终用户展示所有标签的内容。在LabVIEW中,我可以画出这样的结构:

我不知道如何在 WPF 中实现类似的结构。你能给我一些建议吗?

请考虑到我完全控制了应用程序,我可以修改它的各个方面,我试图了解实现我的要求的最佳方式。

PS 布尔指标已经作为 NI 的 WPF 项目提供,无需从头开始绘制。

编辑:带有 ItemTemplate 的 ItemsControl 以及示例布局解决了我的问题。非常感谢。

【问题讨论】:

  • 嗯,最好的方法是学习 WPF UI 控件。然后您将看到如何组装它们以创建如上所示的类似输出。只是快速浏览一下,我看到了StackPanelDockPanelTextBlockTextBoxImage...的用例...

标签: c# wpf mvvm controls


【解决方案1】:

您需要对其进行改进,但它应该为您提供一个开始的地方:您应该将整个东西变成一个自定义控件,并将列变成另一个自定义控件,正如它在 cmets 中所说的那样。

绿色圆圈是复选框,其样式以深色或浅绿色圆圈显示其状态(选中或未选中)

结果:

         <Border BorderBrush="Gray" Background="LightGray" BorderThickness="2" MaxWidth="142" HorizontalAlignment="Left">
            <StackPanel HorizontalAlignment="Left">                    
                <Grid Margin="2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock>Channel</TextBlock>
                    <TextBox Grid.Column="1" Margin="5,0,0,0">AMMC_TX1</TextBox>
                </Grid>
                    <ScrollViewer VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Visible">
                <UniformGrid HorizontalAlignment="Left" Rows="1">
                        <!--Turn me into a custom control-->
                        <Border BorderBrush="Gray" BorderThickness="2" MaxWidth="50">
                            <StackPanel>
                                <TextBlock>Label</TextBlock>
                                <TextBox>1</TextBox>
                                <CheckBox IsChecked="True" Margin="5">
                                    <CheckBox.Style>
                                        <Style TargetType="CheckBox">
                                            <Setter Property="Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="CheckBox">
                                                        <Grid>
                                                            <Ellipse Name="eli" Height="30" Width="30" Fill="DarkGreen"/>
                                                        </Grid>
                                                        <ControlTemplate.Triggers>

                                                            <Trigger Property="IsChecked" Value="True">
                                                                <Setter TargetName="eli" Property="Fill" Value="Lime"/>
                                                            </Trigger>
                                                        </ControlTemplate.Triggers>
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>

                                        </Style>
                                    </CheckBox.Style>
                                </CheckBox>
                                <TextBlock>Content</TextBlock>
                                <TextBox>11</TextBox>
                                <TextBox>22</TextBox>
                                <TextBox>33</TextBox>
                            </StackPanel>
                        </Border>
                        <!--Turn me into a custom control-->
                        <Border BorderBrush="Gray" BorderThickness="2" MaxWidth="50">
                            <StackPanel>
                                <TextBlock>Label</TextBlock>
                                <TextBox>1</TextBox>
                                <CheckBox IsChecked="True" Margin="5">
                                    <CheckBox.Style>
                                        <Style TargetType="CheckBox">
                                            <Setter Property="Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="CheckBox">
                                                        <Grid>
                                                            <Ellipse Name="eli" Height="30" Width="30" Fill="DarkGreen"/>
                                                        </Grid>
                                                        <ControlTemplate.Triggers>

                                                            <Trigger Property="IsChecked" Value="True">
                                                                <Setter TargetName="eli" Property="Fill" Value="Lime"/>
                                                            </Trigger>
                                                        </ControlTemplate.Triggers>
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>

                                        </Style>
                                    </CheckBox.Style>
                                </CheckBox>
                                <TextBlock>Content</TextBlock>
                                <TextBox>11</TextBox>
                                <TextBox>22</TextBox>
                                <TextBox>33</TextBox>
                            </StackPanel>
                        </Border>
                        <!--Turn me into a custom control-->
                        <Border BorderBrush="Gray" BorderThickness="2" MaxWidth="50">
                            <StackPanel>
                                <TextBlock>Label</TextBlock>
                                <TextBox>1</TextBox>
                                <CheckBox IsChecked="True" Margin="5">
                                    <CheckBox.Style>
                                        <Style TargetType="CheckBox">
                                            <Setter Property="Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="CheckBox">
                                                        <Grid>
                                                            <Ellipse Name="eli" Height="30" Width="30" Fill="DarkGreen"/>
                                                        </Grid>
                                                        <ControlTemplate.Triggers>

                                                            <Trigger Property="IsChecked" Value="True">
                                                                <Setter TargetName="eli" Property="Fill" Value="Lime"/>
                                                            </Trigger>
                                                        </ControlTemplate.Triggers>
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>

                                        </Style>
                                    </CheckBox.Style>
                                </CheckBox>
                                <TextBlock>Content</TextBlock>
                                <TextBox>11</TextBox>
                                <TextBox>22</TextBox>
                                <TextBox>33</TextBox>
                            </StackPanel>
                        </Border>
                    </UniformGrid>
                    </ScrollViewer>
            </StackPanel>
            </Border>

【讨论】:

  • 您可以将其用作控件列的基本模板,但最终解决方案应该是使用 ItemTemplate 和适当的后备视图模型的 ItemsControl
  • 在查看 OP 的屏幕截图后,看起来每个频道中实际上也应该有不同数量的“标签”(而不是正好 3 个)。这种模式也可以扩展来处理。
  • @BradleyUffner 这实际上是故意的,以及为什么我添加了滚动查看器,如果您添加更多它们,它仍然会按预期工作/如他的示例所示。当变成一个自定义控件时,您可以通过该控件的可观察集合轻松地在代码中添加无限数量的控件
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多