2

私はWindows 8アプリに取り組んでいます。Canvas 内にいくつかのコントロール (画像、四角形) を配置する必要があります。直接行うと、子 (前述のコントロール) で「Canvas.Left」添付プロパティを使用している場合はすべて問題ありません。ただし、MVVM を使用したいと思います。したがって、次のように ItemsControl を使用するようになりました。

    <ItemsControl ItemsSource="{Binding MyObjects}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Image Source="{Binding Image}" Visibility="{Binding IsImage, Converter={StaticResource boolConverter}}" />
                    <Rectangle Canvas.Left="{Binding Left}" Canvas.Top="{Binding Top}" Width="{Binding Width}" Height="{Binding Height}" Fill="{Binding Fill}" Visibility="{Binding IsNoImage, Converter={StaticResource boolConverter}}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

バインディングは、添付された Canvas プロパティを除いて機能しています。いくつかの調査の結果、ItemsControl がその子を ContentPresenter でラップしているためであることがわかりました。したがって、私はstackoverflowで見つけた解決策を利用しようとしましたが、成功しませんでした:

<ItemsControl.ItemContainerStyle>
   <Style TargetType="ContentPresenter">
       <Setter Property="Canvas.Left" Value="{Binding Left}" />
   </Style>
</ItemsControl.ItemContainerStyle>

このコードを追加しても、Canvas.Left プロパティは設定されません (DataTemplate からバインディングを削除した後でも)。

私は何が欠けていますか?前もって感謝します。

4

1 に答える 1

0

最初のコード スニペットは contentpresenter を設定しなくても機能するはずです。'ItemTemplate' はレンダリングするために contentpresenter を必要としないからです。ViewModel と「MyObjects」内に保持されているオブジェクトの両方が IPropertyNotifyChanged を実装していることを確認することをお勧めします。また、出力ウィンドウをチェックして、報告されているバインディングの問題があるかどうかを確認します。

ビューモデルをどのように設定しているかに関するコードとその中のコードを見なければ、それ以上のことはできません。

さらに、あなたの質問にはありませんが、ViewModel で View 固有のプロパティを設定しているようです。良い考えではありません - ビューモデルは、関連する懸念を表示するために不可知論的であるべきです。MVVM を使用することは、どこでもバインディングを使用することを意味するわけではなく、UI コントロール レイアウトの設定などは、コントロールの xaml または参照されるスタイルで明示的に設定する必要があります。

于 2012-11-25T09:56:18.827 に答える