アプリケーション用に単純なUpDownUserControlを作成しました。UpDownコントロールが追加されると、それらが水平方向にスタックするように、リストボックスでレンダリングしています。
私のUserControlには、NumberPropertyと呼ばれるUpDownコントロール内の番号に対応する1つのDependencyPropertyがあります。
データバインディングを介して複数のUpDownコントロールをリストボックスに追加します。ここで、リストボックスのItemsSourceは単にObservableCollection<NumberGroup>
呼び出されNumberGroups
ます。それぞれNumberGroup
にNumberというメンバーがあり、ListBoxがレンダリングされたときにこの番号をそれぞれのUpDownコントロールに表示したいと思います。
私のリストボックスは次のようにXAMLで定義されています。
<ListBox Grid.Row="1" ItemsSource="{Binding NumberGroups}" ItemTemplate="{StaticResource NumberGroupTemplate}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Width="Auto" Height="Auto" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
ListBoxのDataTemplateは次のとおりです。
<DataTemplate x:Key="RackTemplate">
<StackPanel Orientation="Vertical">
<TextBlock>Group</TextBlock>
<updown:UpDown Number="{Binding Number}" />
</StackPanel>
</DataTemplate>
Number
UpDown UserControlのDependencyPropertyにNumberGroupクラスのプロパティと同じ名前を付けたので、少し混乱します。NumberGroupは単に次のとおりです。
public class NumberGroup
{
public int Number { get; set; }
}
アプリケーションを実行すると、[出力]ウィンドウに次のように表示されるため、アプリケーションが機能しないことがすでにわかっています。
System.Windows.Data Error: 39 : BindingExpression path error: 'Number' property not found on 'object' ''UpDown' (Name='')'. BindingExpression:Path=Number; DataItem='UpDown' (Name=''); target element is 'UpDown' (Name=''); target property is 'Number' (type 'Int32')
OK、それで、ListItemの代わりにUserControlにバインドしています...書き込みできません。そこで、テストとして、Resources and ListBox定義からDataTemplateを削除し、再実行しました。ListBoxで、私はたくさんのNumberGroup
sを取得しました。これは、まさに私が期待するものです。
では、これを行うと、どうしてListItemに対してバインドされているように見えますが、ItemTemplateを定義すると、UpDownコントロールにバインドしたいのでしょうか。説明をいただければ幸いです。Dr. WPFの記事を確認しましたが、なぜこれが発生するのかわかりません。
アップデート
わかりました、私は自分の問題に関連する何かを理解しました。UserControl内で、DataContextをそれ自体に設定しているのでICommand
、上ボタンと下ボタンを処理するを処理できます。しかし、どういうわけか私はまだ理解していません、それはListItemのデータバインディングを台無しにします!UserControlがListItem内に含まれている場合、なぜこれが発生するのでしょうか。