2016-03-02 11 views
2

У меня есть UserControl.Как использовать абстрактные классы внутри UserControl

Я хочу, чтобы каждый UserControl для переопределения абстрактного метода.

Это мой абстрактный класс:

public class MyAbstract 
{ 
    public virtual void LoadData() 
    { 

    } 
} 

Это мой UserControl с моей последней попытки получать эту работу:

public partial class ucAbstract : UserControl, MyAbstract 
{ 
    public ucAbstract() 
    { 
     InitializeComponent(); 
    } 

    public override void LoadData() 
    { 
     base.Load(); 
     { 

     } 
    } 
} 

Ошибка:

Класс «ucAbstract 'не может иметь несколько базовых классов:' UserControl 'и' MyAbstract '

Как это сделать?

ДОПОЛНИТЕЛЬНО: Возможно, мне придется удалить это дополнение и создать новый вопрос.

Это то, что я пытаюсь достичь:

Моя главная форма содержит 2 UserControls: ucOne, ucTwo

Оба этих элементов управления есть метод, называемый «LoadData».

У меня есть функция в моей основной форме:

void LoadControl(iuserControl myUserControl) 
{ 
    myUserControl.LoadData(); 
} 
+1

MyAbstract нужно iherit 'UserControl'. Вы не можете наследовать несколько классов одновременно в C#. Вы должны наследовать цепочку иерархически. Извините, если есть лучший термин для использования. – TyCobb

+1

C# не имеет множественного наследования –

+0

'MyAbstract' * не *' abstract', а ваш 'ucAbstract' класс пытается наследовать из двух базовых классов, что невозможно в C#. –

ответ

3

Как об этом.

Создать базу class, которая содержит все распространенные методы вашего UserControl. Убедитесь в том, что она распространяется с UserControl класса

MyAbstract.cs

public abstract class MyAbstract : UserControl 
{ 
    public virtual void LoadData() 
    { 

    } 
} 

затем создать UserControl и расширить, что с MyAbstract класса. Вы можете так использовать.

ucAbstract.xaml.CS

public partial class ucAbstract : MyAbstract 
{ 
    public ucAbstract() 
    { 
     InitializeComponent(); 
    } 

    public override void LoadData() 
    { 
     base.LoadData(); 
     { 

     } 
    } 
} 

Кроме того, вы должны иметь <local:MyAbstract> вместо <UserControl> в XAML

ucAbstract.xaml

<local:MyAbstract x:Class="YourNamespace.ucAbstract" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:YourNamespace" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <StackPanel> 
     <TextBox /> 
    </StackPanel> 
</local:MyAbstract> 

Примечание:

  • Вы можете создать несколько UserControl s с MyAbstract в качестве BaseClass.
  • UserControls только один уровень наследования, по крайней мере, если MyAbstract имеет XAML, это наверняка не сработает.

Ссылка:Partial declarations, must not specify different base classes

+1

Привет, спасибо за это. Я был почти в одной из моих попыток. Я сделал, как вы сказали, но я не отметил класс как абстрактный - также спасибо за ссылку –

2

C# не поддерживает множественное наследование, и вы не можете наследовать от нескольких классов (UserControl и MyAbstract). Вы можете использовать interface вместо класса, как это:

public interface IMyAbstract 
{ 
    void LoadData(); 
} 

Затем вы должны реализовать интерфейс, как это:

public partial class ucAbstract : UserControl, IMyAbstract 
{ 
    public void LoadData() 
    { 

    } 
} 
+0

Спасибо. Поскольку это будет работать для меня. Я могу принять за 5 минут –

0

Вы на самом деле нужно ICommand объект с правильной CommandParameter для условной нагрузки, вместо вашей LoadData() метод.

+0

спасибо, что я изучаю это сейчас –

+0

@AndrewSimpson замечательный учебник http://www.blackwasp.co.uk/WPFCustomCommands_2.aspx – AnjumSKhan

+0

спасибо за это –

0

Вы можете создать свой UserControl

Public class MyUserControl : UserControl 
{ 
public virtual LoadData() 
{ 
// ... 
} 
} 

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

  • Нет связанных вопросов^_^