1

アプリケーション用に単純な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>

NumberUpDown 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で、私はたくさんのNumberGroupsを取得しました。これは、まさに私が期待するものです。

では、これを行うと、どうしてListItemに対してバインドされているように見えますが、ItemTemplateを定義すると、UpDownコントロールにバインドしたいのでしょうか。説明をいただければ幸いです。Dr. WPFの記事を確認しましたが、なぜこれが発生するのかわかりません。

アップデート

わかりました、私は自分の問題に関連する何かを理解しました。UserControl内で、DataContextをそれ自体に設定しているのでICommand、上ボタンと下ボタンを処理するを処理できます。しかし、どういうわけか私はまだ理解していません、それはListItemのデータバインディングを台無しにします!UserControlがListItem内に含まれている場合、なぜこれが発生するのでしょうか。

4

1 に答える 1

1

UserControlのDataContextを内部的にそれ自体に設定すると、これを行った場合とまったく同じ効果が得られます。

<updown:UpDown DataContext="{Binding RelativeSource={RelativeSource Self}}" />

明らかに、明示的なソースが定義されていない設定したバインディングは、コンテキストとしてUpDownコントロールを使用します。したがって、Numberプロパティにバインドしようとすると、ListBoxItemのデータではなくUpDownでNumberプロパティが検索されます。これはまさにあなたのエラーがあなたに伝えていることです。

これを回避するには、UserControlのDataContext設定を変更して、x:Nameを持つルートレイアウトグリッドなど、コントロール内の要素に適用します。

<Grid x:Name="LayoutRoot">
...
</Grid>

そして、コードまたはXAMLのいずれかでDataContextを設定します。

LayoutRoot.DataContext = this;
于 2010-07-22T02:55:47.477 に答える