2013-04-09 4 views
1

У меня есть набор элементов управления пользователя, и я пытаюсь проверить, могу ли я создать для них базовый класс с некоторыми свойствами зависимостей.Наследуемые свойства зависимостей

В частности, большинство моих пользовательских элементов управления имеет следующий формат ...

<UserControl DataContext="{Binding MyDataContext}" > 
    <Expander IsExpanded="{Binding MyExpandedByDefault}"> 
     <TextBlock>Some text</TextBlock> 
    </Expander> 
</UserControl> 

Конечно, как правило, если это был просто один-офф, я бы написать свойство зависимостей в коде для над пользовательским контролем. Однако, так как у меня есть несколько пользовательских элементов управления, которые следуют в том же формате, я хотел бы поставить что-то вроде следующего в базовом классе ...

public bool ExpandedByDefault 
{ 
    get { return (bool)GetValue(ExpandedByDefaultProperty); } 
    set { SetValue(ExpandedByDefaultProperty, value); } 
} 

public static readonly DependencyProperty ExpandedByDefaultProperty = 
    DependencyProperty.Register("ExpandedByDefault", typeof(bool), typeof(MyBaseView), new UIPropertyMetadata()); 

Я хотел бы, чтобы это наследоваться где-то так в моем Главное окно я могу сделать что-то вроде ....

<Window> 
    <StackPanel> 
     <my:Alpha ExpandedByDefault="True" /> 
     <my:Bravo ExpandedByDefault="False" /> 
    </StackPanel> 
</Window> 

Благодаря

EDIT:

Я сделал базовый класс, как так ...

public class ViewBase : UserControl 
{ 
    public static readonly DependencyProperty ExpandedByDefaultProperty = 
       DependencyProperty.Register("ExpandedByDefault", 
              typeof(bool), 
              typeof(FiapaDbViewerBase), 
              new FrameworkPropertyMetadata()); 

    public bool ExpandedByDefault 
    { 
     get 
     { 
      return (bool)this.GetValue(ExpandedByDefaultProperty); 
     } 
     set 
     { 
      this.SetValue(ExpandedByDefaultProperty, value); 
     } 
    } 
} 

Но когда я пытаюсь наследовать его в код для моего пользовательского элемента управления, как так ....

public partial class MyUserControl : ViewBase 
{ 
    public MyUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

Я получаю сообщение об ошибке говорящее

Partial declarations of 'MyUserControl' must not specify different base classes 

И я не могу найти другую часть частичного класса в моем решении ??? Я попытался найти его во всем решении ...

+0

Что вы хотите сказать? Похоже, у вас уже есть ответ. –

ответ

2

У вас может быть наследование. Подобно:

  1. Определить базовый класс:

    public class BaseExpanderUC : UserControl 
    { 
        public bool ExpandedByDefault 
        { 
         get { return (bool)GetValue(ExpandedByDefaultProperty); } 
         set { SetValue(ExpandedByDefaultProperty, value); } 
        } 
    
        public static readonly DependencyProperty ExpandedByDefaultProperty = 
         DependencyProperty.Register("ExpandedByDefault", typeof(bool), typeof(MyBaseView), new UIPropertyMetadata(false)); 
    } 
    
  2. Определить наследственные классы:

    public class Alpha : BaseExpanderUC{} 
    public class Bravo : BaseExpanderUC{} 
    
  3. В каждом из XAMLs каждых унаследованных классов (Alpha и Bravo выше), используйте этот макуп:

    <BaseExpanderUC> 
        <Expander IsExpanded="{Binding MyExpandedByDefault, 
                RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:BaseExpanderUC}}}"> 
         <TextBlock>Some text</TextBlock> 
        </Expander> 
    </BaseExpanderUC> 
    

    Где «local» - это xmlns для пространства имен BaseExpanderUC.

Это потребует от вас определения пользовательского интерфейса для каждого UC. Если у вас есть общий интерфейс для всех элементов управления, я настоятельно рекомендую вам использовать настраиваемый элемент управления (возможно, наследующий Expander). Затем вам нужно будет определить интерфейс только один раз, в ControlTemplate.

+0

См. Мое изменение выше об ошибке, с которой я столкнулся. – imdandman

+0

Упс, скопировав ваш код, не изменил корневой элемент в XAML. См. Мое редактирование в разделе 3. – XAMeLi

+0

Спасибо за ваше редактирование ... но как это исправить частичную ошибку класса, которую я получаю? Благодарю. – imdandman

Смежные вопросы