2

そのビューのリソースにいくつかのデータテンプレートを含むビューがあります。(この特定のビューでのみ必要になるため、グローバルな場所に配置したくありません)

コンバーターで取得した値に基づいて、テンプレートを切り替えます。

public class SplitTemplateSelector : IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int splitCount = (int)value;
            var _view = new IdtDetailView();

            DataTemplate template;
            if (splitCount == 1)
            {
                //(DataTemplate)_view.Resources["SingleSplitTemplate"];
                template = (DataTemplate)_view.Resources.Where(w => w.Key.Equals("SingleSplitTemplate")).FirstOrDefault().Value;
            }
            else
            {
                template = (DataTemplate)_view.Resources.Where(w => w.Key.Equals("MultiSplitTemplate")).FirstOrDefault().Value;
            }

            return template;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

これは意図したとおりに機能しますが、新しいインスタンスを作成するためIdtDetailView()、変数が適切に設定されていないなどの問題が発生します。したがって、私の質問は...

新しいIdtDetailViewを作成する必要がないように、このコンバーターを呼び出したビューを渡すかアクセスするにはどうすればよいですか?

4

2 に答える 2

4

次の解決策を提案します:

 public class SplitTemplateSelector : DependencyObject, IValueConverter
    {
        public static readonly DependencyProperty SingleSplitTemplateProperty =
            DependencyProperty.Register("SingleSplitTemplate",
                                        typeof (DataTemplate),
                                        typeof(SplitTemplateSelector),
                                        null);

        public DataTemplate SingleSplitTemplate
        {
            get { return (DataTemplate) GetValue(SingleSplitTemplateProperty); }
            set { SetValue(SingleSplitTemplateProperty, value); }
        }

        public static readonly DependencyProperty MultiSplitTemplateProperty =
            DependencyProperty.Register("MultiSplitTemplate",
                                        typeof (DataTemplate),
                                        typeof(SplitTemplateSelector),
                                        null);

        public DataTemplate MultiSplitTemplate
        {
            get { return (DataTemplate) GetValue(MultiSplitTemplateProperty); }
            set { SetValue(MultiSplitTemplateProperty, value); }
        }

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            int splitCount = (int)value;
            return splitCount == 1 ? SingleSplitTemplate : MultiSplitTemplate;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }

    }

XAML の場合:

<c:SplitTemplateSelector x:Key="SplitTemplateSelector" SingleSplitTemplate="{StaticResource SingleSplitTemplate}" MultiSplitTemplate="{StaticResource MultiSplitTemplate}"/>

ご存じのとおり、ユーザー コントロール リソースのローカル データ テンプレートの近くにコンバーターを配置できます。

于 2011-09-19T12:39:50.983 に答える
1

ある種のDataTemplateSelectorが必要なようです。残念ながら、このクラスは WPF にしか存在しませんが、Web 上でいくつかの代替実装を見つけることができます。例: http://skysigal.xact-solutions.com/Blog/tabid/427/entryid/1404/Silverlight-a-port-of-the-DataTemplateSelector.aspx

アイデアは、データ テンプレートの配列を持つコンテンツ コントロールを持つことです。表示されるコンテンツの選択は値に基づいています(あなたの場合は整数です)。

于 2011-09-19T00:47:01.563 に答える