WPF设计时数据和数据模板

时间:2015-08-19 14:40:13

标签: c# wpf xaml listbox design-time-data

我正在开发一个WPF用户控件,我想让它显示一些设计时数据。事情证明这是一个很好的挑战,我可以真正使用你的帮助。

到目前为止我的控制权基本上是<ListBox>

<UserControl x:Class="TA.Weather.UI.Wpf.WorkingSetEditor"
             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"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Loaded="HandleLoadedEvent"
             >
    <Grid d:DataContext="{d:DesignData Source=/SampleData/WorkingSet.xaml}">
        <ListBox x:Name="WorkingSetListBox"  >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition MinWidth="30" />
                    <ColumnDefinition MinWidth="30" />
                    <ColumnDefinition MinWidth="30" />
                    <ColumnDefinition MinWidth="30" />
                    <ColumnDefinition MinWidth="30" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.StationId}"></TextBlock>
                <TextBlock Grid.Column="1" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.SensorId}"></TextBlock>
                <TextBlock Grid.Column="2" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.SensorName}"></TextBlock>
                <TextBlock Grid.Column="3" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.LowerLimit}"></TextBlock>
                <TextBlock Grid.Column="4" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.UpperLimit}"></TextBlock>
                <CheckBox Grid.Column="5" x:Name="MonitoredCheckBox"
                          IsChecked="{Binding Path=[1].Monitored}"/>
            </Grid>
        </ListBox>
    </Grid>
</UserControl>

我想出了如何在另一个XAML文件中创建设计时数据,并将构建操作设置为DesignDataWithDesignTimeCreatableTypes。该类型基本上只是一个DTO,因此在设计时创建实例似乎没问题。所以这里是数据文件,包含一个List<SensorState>,其中包含两个成员:

<generic:List x:TypeArguments="ws:SensorState"
              xmlns:ws="clr-namespace:TA.Weather.Core;assembly=TA.Weather.Core"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:generic="clr-namespace:System.Collections.Generic;assembly=mscorlib">
    <ws:SensorState IdleTimeout="300" LastUpdate="2015-08-19T03:39:00.000Z" Monitored="False"
                    WithinAcceptableLimits="False">
        <ws:SensorState.Limits>
            <ws:SensorLimits StationId="12-34-56-78-90-12" SensorId="1" SensorName="Inside Temperature"
                             LowerLimit="-10" UpperLimit="30" />
        </ws:SensorState.Limits>
    </ws:SensorState>
    <ws:SensorState IdleTimeout="300" LastUpdate="2015-08-19T03:39:00.000Z" Monitored="True"
                    WithinAcceptableLimits="False">
        <ws:SensorState.Limits>
            <ws:SensorLimits StationId="12-34-56-78-90-12" SensorId="1" SensorName="Inside Temperature"
                             LowerLimit="-10" UpperLimit="30" />
        </ws:SensorState.Limits>
    </ws:SensorState>
</generic:List>

到目前为止,这让我得到一个如下所示的用户控件: User control with design-time data

所以,各种各样的成功。但是,目前有两个问题:

  • 当列表中有两个项目时,为什么只显示一行?我可以通过更改绑定表达式中的数组索引来控制哪个实例显示,但是如何让行重复?我尝试删除数组索引,但这只是一个编译错误。
  • 我收到错误的表单数据文件&#34;会员XXX无法识别或无法访问&#34;,我设置的每个属性一个,总共36个。即使构建成功,设计时数据也会显示在编辑器中。它们是错误所以我确定它们很重要 - 我只是不知道编译器试图告诉我什么。那么这些错误意味着什么呢?我需要做些什么才能减轻它们呢?

还有更多。我想使用DataTemplate来创建更好的数据外观;稍后会有一个用于设置限制等的滑块控件,所以这里是我尝试使用模板的方式:

<UserControl x:Class="TA.Weather.UI.Wpf.WorkingSetEditor"
             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:core="clr-namespace:TA.Weather.Core;assembly=TA.Weather.Core"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Loaded="HandleLoadedEvent"
             >
    <Grid d:DataContext="{d:DesignData Source=/SampleData/WorkingSet.xaml}">
        <Grid.Resources>
            <DataTemplate x:Key="WorkingSetTemplate">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="30" />
                        <ColumnDefinition MinWidth="30" />
                        <ColumnDefinition MinWidth="30" />
                        <ColumnDefinition MinWidth="30" />
                        <ColumnDefinition MinWidth="30" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.StationId}"></TextBlock>
                    <TextBlock Grid.Column="1" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.SensorId}"></TextBlock>
                    <TextBlock Grid.Column="2" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.SensorName}"></TextBlock>
                    <TextBlock Grid.Column="3" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.LowerLimit}"></TextBlock>
                    <TextBlock Grid.Column="4" TextAlignment="Center"
                           Text="{Binding Path=[0].Limits.UpperLimit}"></TextBlock>
                    <CheckBox Grid.Column="5" x:Name="MonitoredCheckBox"
                          IsChecked="{Binding Path=[1].Monitored}"/>
                </Grid>

            </DataTemplate>
        </Grid.Resources>
        <ListBox x:Name="WorkingSetListBox" ItemTemplate="{DynamicResource WorkingSetTemplate}">
        </ListBox>
    </Grid>
</UserControl>

基本上,我已将<Grid>移出<ListBox>并移至<DataTemplate>资源。一旦我这样做,设计时数据就会消失,我只剩下设计师的空白控件。所以我的第三个问题就变成了:

  • 当我使用<DataTemplate>时,为什么设计时数据会消失?我需要做些什么不同的事情?

你可能会说我几乎没有使用WPF的经验......我必须承认我正在努力使用绑定表达式,它们看起来像某种神秘的魔法,对它们来说几乎没有韵律或理由。我想也许我在某个地方错过了一个重要的概念。我希望你能给我一些明智的话,让我朝着正确的方向前进。

0 个答案:

没有答案