【问题标题】:C# - Passing View to the converter as parameterC# - 将视图作为参数传递给转换器
【发布时间】:2011-11-19 21:00:08
【问题描述】:

我有一个视图,该视图的资源中有几个数据模板(我不想把它放在全局的地方,因为它只需要这个特定的视图)

根据我在转换器中获得的值,我切换模板。

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?

【问题讨论】:

  • 另外请注意,我使用 Keys 来查找数据模板,因为如果我只使用名称,我第二次调用此转换器 SL 会抱怨具有以下名称的数据模板已经存在。

标签: c# silverlight binding converters


【解决方案1】:

我建议下一个解决方案:

 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}"/>

如您所见,您可以将转换器放在用户控制资源中的本地数据模板附近

【讨论】:

  • 一如既往,答案就在中间。我需要数据模板选择器和转换器之间的混合体。
【解决方案2】:

听起来你需要某种DataTemplateSelector。 不幸的是,此类仅存在于 WPF 中,但您可以在 Web 上找到一些替代实现。 例如: http://skysigal.xact-solutions.com/Blog/tabid/427/entryid/1404/Silverlight-a-port-of-the-DataTemplateSelector.aspx

这个想法是拥有一个包含数据模板数组的内容控件。显示内容的选择基于一个值(在您的情况下它是一个整数)。

【讨论】:

  • 我已经设法从 Telerik 实现 DataTemplateSelector,但是现在我无法获取 ItemsSource 的 Count 属性,因为我的选择是基于我的可观察集合中的行数。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多