【问题标题】:Caliburn.Micro convention for Accordion and AccordionItemAccordion 和 AccordionItem 的 Caliburn.Micro 约定
【发布时间】:2011-07-01 00:08:26
【问题描述】:

我想对 Silverlight 和 WPF 工具包中的 Accordion 控件使用 Caliburn.Micro 约定:

查看:

<Grid Background="White">
    <Controls:Accordion x:Name="Items"/>
</Grid>

视图模型:

public class ShellViewModel : IShell
{
    public ShellViewModel()
    {
        Items = new List<AccItemViewModel>
                    {
                        new AccItemViewModel
                            {
                                DisplayName = "header one", 
                                Content = "content one"
                            },
                        new AccItemViewModel
                            {
                                DisplayName = "header two", 
                                Content = "content two"
                            },
                    };
    }

    public IEnumerable<IScreen> Items { get; set; }


    public class AccItemViewModel : Screen
    {
        public string Content { get; set; }
    }

默认情况下,Caliburn 将 Accordion 的 ItemsSource 中的元素绑定到 AccordionItem 标头中:


我已经为 Accordion 的 ContentTemplate 添加了约定:

    private void AddCustomConventions()
    {
        ConventionManager.AddElementConvention<Accordion>
        (Accordion.ItemsSourceProperty, "SelectedItem", "SelectionChanged")
        .ApplyBinding =
        (viewModelType, path, property, element, convention) =>
        {
            if (ConventionManager
            .GetElementConvention(typeof(ItemsControl))
            .ApplyBinding(viewModelType, path, property,
            element, convention))
            {
                element.SetValue(Accordion.ContentTemplateProperty,
                ConventionManager.DefaultItemTemplate);
                return true;
            }
            return false;
        };
    }

取得了以下成绩:

但我想将 AccordionItem 的标头绑定到 AccItemViewModel(IScreen) 的 DisplayName,或者在 AccItemViewModel 上有一个标头视图模型属性。 AccordionItem 有 HeaderProperty 和 HeaderTemplateProperty,但我不知道如何对这些应用约定。

【问题讨论】:

    标签: silverlight caliburn.micro


    【解决方案1】:

    查看源代码下的 WPF TabControl 约定。这应该会让你走上正确的道路。

    【讨论】:

      【解决方案2】:

      看起来,Accordion 确实与 TabControl 极为相似,而我的问题中缺少的 sn-p 部分是

      ConventionManager
        .ApplyHeaderTemplate(accordion, 
           ItemsControl.ItemTemplateProperty, viewModelType);
      

      为了您的方便,这里是完整的约定(顺便说一句,此代码可以推广到 ItemsControl 的多个后代):

              ConventionManager.AddElementConvention<Accordion>(
                  ItemsControl.ItemsSourceProperty, 
                  "ItemsSource", "SelectionChanged")
                  .ApplyBinding = (
                      viewModelType, path, property, element, convention) =>
                  {
                      if (!ConventionManager.SetBinding(
                          viewModelType, path, property, element, convention))
                          return false;
      
                      var accordion = (Accordion)element;
                      if (accordion.ContentTemplate == null
                          && property.PropertyType.IsGenericType)
                      {
                          var itemType = property
                              .PropertyType
                              .GetGenericArguments()
                              .First();
                          if (!itemType.IsValueType &&
                              !typeof(string).IsAssignableFrom(itemType))
                          {
                              accordion.ContentTemplate = 
                                  ConventionManager.DefaultItemTemplate;
                          }
                      }
      
                      ConventionManager.ConfigureSelectedItem(
                          element, Selector.SelectedItemProperty, 
                          viewModelType, path);
      
                      if (string.IsNullOrEmpty(accordion.DisplayMemberPath))
                          ConventionManager.ApplyHeaderTemplate(
                              accordion, ItemsControl.ItemTemplateProperty, 
                              viewModelType);
      
                      return true;
                  };
              ConventionManager.AddElementConvention<AccordionItem>(
                  ContentControl.ContentProperty, 
                  "DataContext", "DataContextChanged");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多