私は 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>
2 つのメンバーを持つを含むデータ ファイルは次のとおりです。
<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>
これまでのところ、次のようなユーザー コントロールが得られます。
だから、ある種の成功。ただし、この時点で 2 つの疑問があります。
- リストに項目が 2 つあるのに 1 行しか表示されないのはなぜですか? バインディング式の配列インデックスを変更することで、どのインスタンスが表示されるかを制御できますが、行を繰り返すにはどうすればよいでしょうか? 配列インデックスを削除しようとしましたが、コンパイル エラーが発生します。
- 「メンバー XXX が認識されないか、アクセスできません」という形式のデータ ファイルに対して、設定しているプロパティごとに 1 つずつ、合計 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>
。これを行うとすぐに、デザイン時のデータが消え、デザイナーに空白のコントロールだけが残ります。したがって、私の3番目の質問は次のようになります。<ListBox>
<DataTemplate>
- を使用すると設計時のデータが消えるのはなぜ
<DataTemplate>
ですか? 他に何をする必要がありますか?
おそらく、私は WPF の経験がほとんどないことがわかります...式をバインドするのに少し苦労していることを認めなければなりません。それらは、韻や理由がほとんどないある種の難解な魔法のようです。重要な概念がどこかに欠けているのではないかと思います。私を正しい方向に押し進めるための賢明な言葉をいくつか教えていただければ幸いです。