2

みなさん、こんにちは。dataGridの列のテンプレートを変更しようとしていますが、XAMLで変更する方法が見つかりません。私はこの方法でそれをやろうとしています

<DataTemplate>
    <DataTemplate.Triggers>
        <Trigger Property="{Binding ElementName=isComboBox, Path=IsChecked}"
                 Value="True">
            <Setter Property="VisualTree">
                <Setter.Value>
                    <ComboBox ItemsSource="{Binding elementos}"/>                
                </Setter.Value>
            </Setter>
        </Trigger>
    </DataTemplate.Triggers>
</DataTemplate>

しかし、エラーはThe property VisualTree cannot be set as a property element on template. Only Triggers and Storyboards are allowed as property elements、別のコントロールに従ってDataGridCellのテンプレートを変更する別の方法を知っているボディがあることを示していますか?

4

1 に答える 1

2

template内のテンプレートを変更しないでください。それは機能しません。

これを行うにはいくつかの方法があります。アプリケーションの構成方法によって異なります。最も一般的な方法は、

  1. ContentControl または ItemsControl がプロパティ/コレクションにバインドされている
  2. コレクションには、異なるタイプのインスタンスが 1 つ以上含まれています
  3. インスタンス タイプと一致する DataType を持つアプリケーションのリソース内で DataTemplate を定義します。

たとえば、アプリケーションにいくつかのモデルがあるとします

public sealed class Foo
{
    public string Text {get;set;}
}

public sealed class Bar
{
    public bool Checked {get;set;}
}

アプリケーションは、これらのインスタンスを 1 つ以上含むプロパティを公開します

public partial class MainWindow : Window
{
    //INotifyPropertyChanged/DependencyObject stuff left out!
    public object FooOrBar {get;set;} 

    //snip
}

XAML には、プロパティにバインドできるItemsControlまたはContentControlなどを拡張する UIElement タイプがあります。

<Window 
    x:Name="root"
    xmlns:t="clr-namespace:MyApplicationWhereFooAndBarLive"
    SkipAllThatXmlnsDefinitionNonsenseForSpaceSavingsInThisExample="true"/>  
    <!-- see Resources below --> 
    <ConentControl Content="{Binding FooOrBar, ElementName=root}" />
</Window>

最後に、アプリケーションのリソース内でタイプごとに DataTemplates を定義します。

<Window.Resources>
    <DataTemplate DataType="{x:Type t:Foo}">
        <TextBox Text="{Binding Text}" />
    </DataTemplate >
    <DataTemplate DataType="{x:Type t:Bar}">
        <CheckBox Checked="{Binding Checked}" />
    </DataTemplate >
</Window.Resources>

DataTemplate 選択のプロセスは次のようになります。

  1. 誰かがどこかに設定します(この例では言います)FooOrBar = new Foo();
  2. ContentControl のコンテンツ バインディングの更新 (INPC または DependencyProperty 経由)
  3. ContentControl はそのDataTemplateSelectorを探し、構成されていないことを検出し、デフォルトの実装を使用します。
  4. デフォルトの DataTemplateSelector は、Content プロパティにバインドされたオブジェクトの型を取得します。
  5. DataTemplateSelector は (本質的に) DataTemplate であり、ステップ 4 で識別されたインスタンス タイプと一致するタイプのキーを持つ Resourceの論理ツリーを検索します。
  6. DataTemplate が見つかり、ConentControl に渡されます
  7. ContentControlLoadContent()メソッドを介してビジュアル ツリーを読み込みます。
  8. ContentControl は、このビジュアル ツリーのルートの DataContext を Content プロパティ (この場合は の新しいインスタンスFoo)内の値に設定します。
  9. このビジュアル ツリーは (IIRC) ConentControl の子として追加され、UI 内に表示されるようになりました。

中間が追加されることを除いて、ほぼ同じことが ItemsControl にも当てはまります (つまり、ListBox は ListBoxItem を中間として使用し、LBI は ContentControl です)。

于 2012-07-16T19:59:12.213 に答える