WPF / XAML / MVVM - Установить состояние флажков на основе условий - PullRequest
0 голосов
/ 27 октября 2018

Я - традиционный программист MVC, который только начал использовать MVVM, и я не знаю, как я запрограммировал бы следующий сценарий MVVM. Мне, вероятно, нужно мультисвязывание, но кто-то может мне помочь и написать этот код для меня? Я часами пытался добиться этого, но я просто не знаю, как это сделать ...

Кстати, я знаю, как установить значения из моего файла настроек в XAML, но не знаю, как написать другую логику, например:

IsEnabled="{Binding Source={x:Static p:Settings.Default}, Path=Pref_QuickProcess}"

Это мой сценарий:

У меня есть простой экран настроек с двумя флажками:

□ Быстрый процесс (значение устанавливается из Settings.Default.Pref_QuickProcess)

□ Загрузить на YouTube (значение устанавливается из Settings.Default.Pref_UploadToYoutube)

Применяются следующие условия:

  • Если «Быстрый процесс» имеет значение «истина», для «Выгрузка на YouTube» всегда должно быть установлено значение «Ложь», и его необходимо отключить.
  • Если для параметра «Быстрый процесс» задано значение «ложь», необходимо включить «Загрузить на YouTube».

Это единственные опции:

Examples

Это мой XAML:

<Window x:Class="SchismRecorder.PreferencesWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Title="Preferences" Height="450" Width="800">

<Grid>
    <GroupBox Header="Debug settings" HorizontalAlignment="Left" Height="326" Margin="21,20,0,0" VerticalAlignment="Top" Width="733">
        <StackPanel>
            <CheckBox Content="Quick process" HorizontalAlignment="Left" x:Name="chkQuickProcess" />
            <CheckBox Content="Upload to Youtube" HorizontalAlignment="Left" x:Name="chkUploadToYoutube" />
        </StackPanel>
    </GroupBox>
</Grid>

Это мой код:

public partial class PreferencesWindow : Window
{
    public PreferencesWindow()
    {
        InitializeComponent();

        chkQuickProcess.IsChecked = Settings.Default.Pref_QuickProcess;
        chkUploadToYoutube.IsChecked = Settings.Default.Pref_UploadToYoutube;

        ConfigureCheckboxes();

        chkQuickProcess.Click -= ChkQuickProcess_Click;
        chkQuickProcess.Click += ChkQuickProcess_Click;
    }

    private void ChkQuickProcess_Click(object sender, RoutedEventArgs e)
    {
        ConfigureCheckboxes();
    }

    void ConfigureCheckboxes()
    {
        if (chkQuickProcess.IsChecked.HasValue)
        {
            var isChecked = chkQuickProcess.IsChecked.Value;

            if (isChecked)
            {
                chkUploadToYoutube.IsChecked = false;
                chkUploadToYoutube.IsEnabled = false;
            }
            else
            {
                chkUploadToYoutube.IsEnabled = true;
            }
        }
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        Settings.Default.Pref_QuickProcess = chkQuickProcess.IsChecked ?? false;
        Settings.Default.Pref_UploadToYoutube = chkUploadToYoutube.IsChecked ?? false;
        Settings.Default.Save();

        base.OnClosing(e);
    }
}

Как мне избавиться от своего кода и получить такой же результат в XAML с такими вещами, как триггеры данных, конвертеры, мультисвязывание?

Редактировать: Я думаю, что мне не обязательно нужна модель представления с сеттерами для реализации этой логики, и делать это с триггерами данных? / мульти связывание? вместо. Но может быть, это невозможно?

1 Ответ

0 голосов
/ 27 октября 2018

Возможно, вам не нужна модель представления, чтобы просто установить несколько свойств в классе «Настройки», которые имеют определенную взаимозависимость. Следующий XAML должен выполнять большинство или, возможно, все, что вы описываете.

Когда первый флажок установлен, свойства IsChecked и IsEnabled второго флажка устанавливаются в false. Однако значение свойства Settings.Default.Pref_UploadToYoutube не изменяется. Не уверен, строго ли это необходимо.

По умолчанию второе свойство CheckBox IsChecked привязано к Pref_UploadToYoutube с помощью установщика стиля. DataTrigger в свойстве Pref_QuickProcess заменяет привязку и устанавливает для IsChecked и IsEnabled значение false.

Также обратите внимание на новый синтаксис Binding Path для привязки к статическим свойствам.

<CheckBox Content="Quick process"
          IsChecked="{Binding Path=(p:Settings.Default).Pref_QuickProcess}"/>

<CheckBox Content="Upload to Youtube">
    <CheckBox.Style>
        <Style TargetType="CheckBox">
            <Setter Property="IsChecked"
                    Value="{Binding Path=(p:Settings.Default).Pref_UploadToYoutube}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=(p:Settings.Default).Pref_QuickProcess}"
                             Value="True">
                    <Setter Property="IsChecked" Value="False"/>
                    <Setter Property="IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </CheckBox.Style>
</CheckBox>

Вы также можете упростить пути привязки свойств настроек, назначив экземпляр Settings.Default один раз для DataContext родительского элемента StackPanel CheckBoxes:

<StackPanel DataContext="{Binding Path=(p:Settings.Default)}">

    <CheckBox Content="Quick process" IsChecked="{Binding Pref_QuickProcess}"/>

    <CheckBox Content="Upload to Youtube">
        <CheckBox.Style>
            <Style TargetType="CheckBox">
                <Setter Property="IsChecked" Value="{Binding Pref_UploadToYoutube}"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Pref_QuickProcess}" Value="True">
                        <Setter Property="IsChecked" Value="False"/>
                        <Setter Property="IsEnabled" Value="False"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </CheckBox.Style>
    </CheckBox>
</StackPanel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...