5

私は独自の UserControl を作成しており、XAMLのUserControl.Resourcesセクションの下に 2 つの異なる DataTemplates があります。リストビューに表示されるオブジェクトのプロパティの値に応じて、これら 2 つのデータ テンプレートのいずれかを選択したいと考えています。これを行うには、カスタムDataTemplateSelectorクラスを作成し、使用する DataTemplate を返すことになっているSelectTemplateメソッドをオーバーライドします。ただし、 UserControls リソースセクションにあるデータテンプレートを「見つける」方法がわかりません。私が見たすべての例は、 Window.Resources からデータテンプレートをフェッチするだけです。この例では、現在の MainWindow をフェッチし、FindResource使用してDataTemplate 、同様の方法でUserControlを取得するにはどうすればよいですか?:


public override DataTemplate 
            SelectTemplate(object item, DependencyObject container)
        {
            if (item != null && item is AuctionItem)
            {
                AuctionItem auctionItem = item as AuctionItem;
                Window window = Application.Current.MainWindow;

                switch (auctionItem.SpecialFeatures)
                {
                    case SpecialFeatures.None:
                        return 
                            window.FindResource("AuctionItem_None") 
                            as DataTemplate;
                    case SpecialFeatures.Color:
                        return 
                            window.FindResource("AuctionItem_Color") 
                            as DataTemplate;
                }
            }

            return null;
        }

上記の例は、ItemsControl.ItemTemplateSelector プロパティからのものです。

4

4 に答える 4

8

これを試して:

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item != null && item is AuctionItem)
        {
            AuctionItem auctionItem = item as AuctionItem;

            switch (auctionItem.SpecialFeatures)
            {
                case SpecialFeatures.None:
                    return 
                        ((FrameworkElement)container).FindResource("AuctionItem_None") 
                        as DataTemplate;
                case SpecialFeatures.Color:
                    return 
                        ((FrameworkElement)container).FindResource("AuctionItem_Color") 
                        as DataTemplate;
            }
        }

        return null;
    }
于 2011-08-17T13:20:56.283 に答える
8

私は通常、次のように、DataTemplateSelector のコンストラクターのパラメーターとして UserControl を使用して、コード ビハインドから DataTemplateSelector をインスタンス化します。

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        Resources["MyDataTemplateSelector"] = new MyDataTemplateSelector(this);
        InitializeComponent();
    }
}

public class MyDataTemplateSelector : DataTemplateSelector
{
    private MyUserControl parent;
    public MyDataTemplateSelector(MyUserControl parent)
    {
        this.parent = parent;
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        parent.DoStuff();
    }
}

町で最も美しい女の子ではありませんが、それは仕事を成し遂げます ;)

お役に立てれば!

于 2009-05-27T14:31:45.270 に答える
2
       <DataTemplate x:Key="addTemplate">
        <Button Command="{Binding Path=AddCommand}">Add</Button>
    </DataTemplate>

    <DataTemplate x:Key="editTemplate">
        <Button Command="{Binding Path=UpdateCommand}">Update</Button>
    </DataTemplate>

    <TemplateSelectors:AddEditTemplateSelector
        AddTemplate="{StaticResource addTemplate}"
        EditTemplate="{StaticResource editTemplate}"
        x:Key="addEditTemplateSelector" />

XAMLのみ!

于 2010-03-25T22:16:47.763 に答える
0

WinRT と Windows Phone のソリューションでは、親コントロールが見つかるまでビジュアル ツリーを上に移動します。

    protected override Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container)
    {
        var parent = FindParent<MyParentControlType>(container as FrameworkElement);

        if(parent != null)
        {
            if (item is Something)
                return parent.Resources["TemplateForSomething"] as DataTemplate;
            else if(item is SomethingElse)
                return parent.Resources["TemplateForSomethingElse"] as DataTemplate;
            else 
                // etc
        }
        else
        {
            return App.Current.Resources["SomeFallbackResource"] as DataTemplate;
        }
    }

    public static T FindParent<T>(FrameworkElement element) where T : FrameworkElement
    {
        FrameworkElement parent = Windows.UI.Xaml.Media.VisualTreeHelper.GetParent(element) as FrameworkElement;

        while (parent != null)
        {
            T correctlyTyped = parent as T;

            if (correctlyTyped != null)
                return correctlyTyped;
            else
                return FindParent<T>(parent);
        }

        return null;
    }

FindParent メソッドは、ここで受け入れられた回答に基づいています: How to get a ListView from a ListViewItem?

于 2014-08-20T13:52:38.740 に答える