Кроссплатформенное наследование моделей представлений - PullRequest
0 голосов
/ 21 ноября 2018

Итак, я столкнулся с проблемой, пытаясь следовать шаблону MVVM для своего проекта WPF, и потратил часы на поиски решения без удачи.Проблема заключается в следующем. Предположим, что у меня есть стандартная библиотека .net, где у меня есть все модели представления для моего приложения, например, предположим, что есть следующие модели представления:

BaseDropDownMenuViewModel , которая наследуется от BaseControlViewModel

AdvancedDropDownMenuViewModel , который наследуется от BaseDropDownMenuViewModel

1015 * MultiD

MultiD, который наследуется от AdvancedDropDownViewModel

Модели представлений содержат как функциональные возможности элементов управления, так и переменные, используемые для их отображения, например BackColor и ForeColor свойство, которое помещается в BaseControlViewModel .Теперь, хотя для меня этого достаточно, я хочу добавить некоторые свойства, которые применяются только для настольных платформ, например, свойство MouseOverBackColor и свойство MouseOverForeColor , и мне также необходимовозможность переопределить существующие, например, BackColor .Эти свойства, конечно, имеют смысл только на настольной платформе, а не на мобильной платформе.

Теперь я нашел два решения для моей проблемы, но их обоих недостаточно ...

  • Создайте новую стандартную библиотеку .net с интерфейсом, который заставляет реализацию свойств, доступных только для настольных приложений, и создайте класс для каждой модели представления базовой библиотеки и реализуйте этот интерфейс .В этом сценарии у меня будет огромное количество дублирующегося кода, но я смогу использовать эти классы для моей версии Windows для моего приложения, и в мобильной версии не будет неиспользуемых переменных для каждого из его элементов управления, например MouseOverBackColor свойство, которым оно не может воспользоваться.

  • , что приводит нас ко второму варианту, который заключается в реализации этих свойств ( MouseOverBackColor , MouseOverForeColor , ...) в BaseControlViewModel в базовой стандартной библиотеке .net, и все версии моего приложения имеют эти переменные, хотя некоторые из них не могут их использовать.Таким образом, я хочу иметь дублирующийся код ...

Я считаю, что эту проблему было бы легко решить, если бы C # поддерживал множественное наследование классов, но так как это не так, я пытаюсь найтиеще один «волшебный» способ решения этой проблемы.Примечание: я также искал трюки для достижения «мультиклассового наследования», но те, которые меня интересовали, хранили классы как переменные в основном классе, что на данный момент меня не интересует, потому что приложение потребовало бы массивногомодификация, чтобы воспользоваться этим трюком ...

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете сделать это с помощью интерфейсов:

Пример - один класс, два интерфейса

public interface IDesktopProperties
{
    Color BackColor {get; set;}
    Color MouseOverBackColor {get; set;}
}

public interface IMobileProperties
{
    Color BackColor {get; set;}
    Orientation ScreenOrientation {get; set;}
}

public class MySuperFancyViewModel : IDesktopProperties, IMobileProperties
{
    public Color BackColor {get; set;}
    public Color MouseOverBackColor {get; set;}
    public Orientation ScreenOrientation {get; set;}
}

Теперь в вашем настольном приложении у вас будет что-то вроде

// Will only see properties BackColor and MouseOverBackColor
private IDesktopProperties myProps;
public MyDesktopUI( IDesktopProperties properties ) // <= injected: MySuperFancyViewModel 
{
    myProps = properties;
}

и соответственно для моб.

// Will only see properties BackColor and ScreenOrientation
private IMobileProperties myProps;
public MyMobileUI( IMobileProperties properties ) // <= injected: MySuperFancyViewModel 
{
    myProps = properties;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...