0

次のような XAML スニペットがあります。

<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
    <Grid>
        /// Stuff

    </Grid>
    <GridView x:Name="MyGrid" />
</DataTemplate>
</UserControl.Resources>

<ns:MyObject x:Name="MyLovelyObject" />

ここで、「MyGrid」へのポインターが必要です。ただし、WPF の本質的な設計により、コード レベルで "MyGrid" に簡単にアクセスすることはできません。だから、私は代替手段を探しています。以下は私がやりたいことですが、構文を完全に理解することはできません (注: GridView は MyObject のパブリック属性です):

<UserControl.Resources>
<DataTemplate DataType="{x:Type ns:MyObject}">
    <Grid>
        /// Stuff

    </Grid>
    <GridView Binding="{Path=GridView}" />

</DataTemplate>
<GridView x:Key="GridViewTemplate">
    /// Lots of stuff
</GridView>
</UserControl.Resources>

<ns:MyObject x:Name="MyLovelyObject" GridView="{Binding GridViewTemplate}" />

とにかく、それは明らかにうまくいきません。基本的に、XAML には次の 2 つの目標があるようです: 1. DataTemplate を使用して MyObject を作成する 2. 別の DataTemplate を使用して MyObject.GridView を初期化する (注: GridView は GUI オブジェクトです)

これに関する何か入力はありますか?

ありがとう。

4

1 に答える 1

0

コードで何をしているのかは 100% わかりませんが、最善を尽くします。

まず、DataTemplates は、オブジェクトの描画方法を WPF に伝えるためだけに存在します。これらは、独自にレンダリングされる実際の UI オブジェクトではありません。

DataTemplate には、Implicit と Explicit の 2 種類があります。

暗黙的な DataTemplates にはx:Keyフィールドがなく、WPF が指定された DataType のオブジェクトをレンダリングするときに自動的に使用されます。

たとえば、<DataTemplate DataType="{x:Type ns:MyObject}">最初のコード ブロックに含まれているため、WPF は、型のオブジェクトをレンダリングする必要があるときはいつでもこのテンプレートを使用します。ns:MyObject

明示的な DataTemplate には がx:Key定義されており、それらを使用する XAML で明示的に定義する必要があります。たとえば、 がある場合<DataTemplate x:Key="CustomNsObjectTemplate">、次のようにオブジェクトに適用できます<ns:MyObject Template="{StaticResource CustomNsObjectTemplate}" />

次に、GridViewオブジェクトが UI オブジェクトの場合は、ContentControl別の を使用するのではなく、 を使用して表示する必要がありますGridView。何かのようなもの

<ContentControl Content="{Binding GridView}" />

今、あなたがやろうとしているのは、あなたのクラスのプロパティに渡して、DataTemplate でカスタム オブジェクトを使用することだと思いますGridViewGridViewUserControl.ResourcesGridViewMyObject

その場合は、GridViewUI オブジェクトを で作成し、定義でバインディング<UserControl.Resources>を使用してオブジェクトに渡します。{Static Resource }MyObject

GridViewまた、DataTemplatea から aGridViewへの の表示方法を切り替えたいと思うでしょう。また、 a のようにとの両方を 1 つの親コントロールにContentControlラップしたいと思うでしょう。そうしないと、例外が発生します。GridGridViewStackPanel

したがって、最終コードは次のようになります。

<UserControl.Resources>
    <DataTemplate DataType="{x:Type ns:MyObject}">
        <StackPanel>
            <Grid>
                /// Stuff
            </Grid>
            <ContentControl Content="{Binding Path=GridView}" />
        </StackPanel>
    </DataTemplate>

    <GridView x:Key="MyCustomGridView">
        /// Lots of stuff
    </GridView>
</UserControl.Resources>

<ns:MyObject GridView="{StaticResource MyCustomGridView}" />
于 2013-02-14T17:53:33.610 に答える