MVVM имеет огромный код по сравнению с кодом позади для тех же самых форм xamarin - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть способ изменить кнопки BackgroundColor, когда каждая кнопка нажата.Это я могу легко сделать из кода.

enter image description here

Использование метода ниже в каждом событии нажатия кнопки

void ButtonStyle(Button btn)
{
    foreach (var button in buttons)
    {
        if (button.Id == btn.Id)
        {
            button.BackgroundColor = Color.Blue;
            button.BorderColor = Color.Red;
            button.TextColor = Color.White;
        }
        else
        {
            button.BackgroundColor = Color.White;
            button.BorderColor = Color.Gray;
            button.TextColor = Color.Blue;
        }
    }
}

Но когда я использую MVVM для той же задачи,У меня есть огромный код для этого

Часть класса ViewModel кода примера кода.

public class AssignmentDetailViewModel : INotifyPropertyChanged
{

    private Color _bgColorBtn1;
    private Color _bgColorBtn2;
    private Color _bgColorBtn3;

    private Color _txtColorBtn1;
    private Color _txtColorBtn2;
    private Color _txtColorBtn3;

    public Color BgColorBtn1
    {
        get { return _bgColorBtn1; }
        set
        {
            if (value == _bgColorBtn1)
                return;
            _bgColorBtn1 = value;
        }
    }
    public Color BgColorBtn2
    {
        get { return _bgColorBtn2; }
        set
        {
            if (value == _bgColorBtn2)
                return;
            _bgColorBtn2 = value;
        }
    }
    public Color BgColorBtn3
    {
        get { return _bgColorBtn3; }
        set
        {
            if (value == _bgColorBtn3)
                return;
            _bgColorBtn3 = value;
        }
    }


    public Color TextColorBtn1
    {
        get { return _txtColorBtn1; }
        set
        {
            if (value == _txtColorBtn1)
                return;
            _txtColorBtn1 = value;
        }
    }

    public Color TextColorBtn2
    {
        get { return _txtColorBtn2; }
        set
        {
            if (value == _txtColorBtn2)
                return;
            _txtColorBtn1 = value;
        }
    }

    public Color TextColorBtn3
    {
        get { return _txtColorBtn3; }
        set
        {
            if (value == _txtColorBtn3)
                return;
            _txtColorBtn1 = value;
        }
    }


    public Command BtnColorsCmd1
    {
        get
        {
            return new Command(() => {

                _bgColorBtn1 = Color.White;
                _txtColorBtn1 = Color.Blue;

            });
        }
    }
    public Command BtnColorsCmd2
    {
        get
        {
            return new Command(() => {

                _bgColorBtn1 = Color.White;
                _txtColorBtn1 = Color.Blue;

            });
        }
    }
    public Command BtnColorsCmd3
    {
        get
        {
            return new Command(() => {

                _bgColorBtn1 = Color.White;
                _txtColorBtn1 = Color.Blue;

            });
        }
    }
}

xaml file

<StackLayout BackgroundColor="White" Spacing="2.5" VerticalOptions="Start" Padding="7,6,7,3" Orientation="Horizontal" x:Name="stackLayou1">
    <Button HorizontalOptions="FillAndExpand" TextColor="{Binding _txtColorBtn1}" BackgroundColor="{Binding _bgColorBtn1}"  x:Name="button1" Text="Assignment"></Button>
    <Button HorizontalOptions="FillAndExpand" TextColor="{Binding _txtColorBtn2}" BackgroundColor="{Binding _bgColorBtn2}"  x:Name="button2" Text="Content"></Button>
    <Button HorizontalOptions="FillAndExpand" TextColor="{Binding _txtColorBtn3}" BackgroundColor="{Binding _bgColorBtn3}"  x:Name="button3" Text="Review"></Button>
</StackLayout>

Есть ли способ уменьшить этот код или другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

В дополнение к данному ответу от Руди Спано вы можете использовать функцию SetProperty(ref backingField, value), сравнимую с той, которая определена в этом хранилище (https://github.com/jamesmontemagno/mvvm-helpers/blob/master/MvvmHelpers/ObservableObject.cs).Конечно, вы можете опустить функцию проверки и действие OnChanged.Таким образом, вы можете уменьшить повторное сравнение и иметь только одну строку для сравнения.

0 голосов
/ 19 сентября 2018

Цель виртуальной машины в MVVM - выполнять операции между вашей моделью (исходя из Web Apis, локальной базы данных или чего-либо еще) и вашим представлением.

=> Привязка данных для отображения информации о модели

=> Команда для достижения процессов

Здесь вы выполняете только те операции пользовательского интерфейса, которые, по моему мнению, не должны выполняться в вашей ViewModel.

Для ваших нужд вам следует:

-Создать элемент управления в определенном файле, обрабатывающий ваше поведение выбора (ContentView или Button напрямую)

-Определить 3 экземпляра в вашем представлении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...