Xamarin Запускает XAML с условием «Любое». Можно ли это сделать без свойств преобразователя или виртуальной машины, управляющих пользовательским интерфейсом? - PullRequest
0 голосов
/ 10 марта 2020

Простейшим примером будет страница с двумя флажками и кнопкой. У кнопки есть два источника данных, один из которых привязан к свойству IsChecked каждого флажка, а установщики указывают на свойство кнопки IsEnabled. В процессе поиска я нашел рекомендации установить для свойства «IsEnabled» значение false и написать DataTrigger для каждого из ваших условий «или», чтобы установить для него значение true. Это потому, что MultiTrigger использует оператор «И».

Привязка работает, но не с той функцией, которую я ищу. Если CheckBox1 отмечен, то кнопка включена. Если флажок CheckBox2 установлен, кнопка остается активной. Если флажок CheckBox1 снят, кнопка отключена. Каковы подходы, чтобы сохранить кнопку включенной в этом сценарии, поскольку CheckBox2 все еще проверен?

Кажется, что это должно быть выполнимо в XAML, так как он обрабатывает только логические свойства элементов управления, существующих в XAML, и устанавливает логические значения, но, похоже, мы получаем DataTrigger (если и только если) и MultiTrigger ( Все условия, так что "И"). Есть ли способ написать триггер для «ЛЮБОГО из этих условий»?

Быстрый пример XAML:

<CheckBox x:Name="CheckBox1" />
<CheckBox x:Name="CheckBox2" />
<Button Text="Submit" IsEnabled="False">
    <Button.Triggers>
        <DataTrigger TargetType="Button" Binding="{Binding Source={x:Reference CheckBox1}, Path=IsChecked}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
        <DataTrigger TargetType="Button" Binding="{Binding Source={x:Reference CheckBox2}, Path=IsChecked}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
    </Button.Triggers>
</Button>

Ответы [ 3 ]

0 голосов
/ 10 марта 2020

Сейчас я перешел, установив свойства виртуальной машины для IsChecked на флажки и установив Command.CanExecute и вызвав Command.CanExecuteChanged () для команды кнопки.

Я с радостью продолжу обсуждение, если у кого-то есть какие-либо дальнейшие идеи.

0 голосов
/ 10 марта 2020

«ЛЮБОМУ» условию могут соответствовать StateTriggers и CompareStateTrigger. См. Также VisualStateManager Target для использования TargetName.

Предполагается, что макет равен StackLayout:

<StackLayout>
    <CheckBox x:Name="CheckBox1" />
    <CheckBox x:Name="CheckBox2" />
    <Button x:Name="button" Text="Submit" IsEnabled="False"/>
</StackLayout>

In Resources:

<Style TargetType="StackLayout">
  <Setter Property="VisualStateManager.VisualStateGroups">
    <VisualStateGroupList>
      <VisualStateGroup>
        <VisualState x:Name="Checked">
          <VisualState.StateTriggers>
            <CompareStateTrigger Property="{Binding Source={x:Reference CheckBox1}, Path=IsChecked}"
                                 Value="True" />
            <CompareStateTrigger Property="{Binding Source={x:Reference CheckBox2}, Path=IsChecked}"
                                 Value="True" />
          </VisualState.StateTriggers>
          <VisualState.Setters>
            <Setter TargetName="button"
                    Property="Button.IsEnabled"
                    Value="True" />
          </VisualState.Setters>
        </VisualState>
        <VisualState x:Name="Unchecked">
          <VisualState.StateTriggers>
            <CompareStateTrigger Property="{Binding Source={x:Reference CheckBox1}, Path=IsChecked}"
                                 Value="False" />
            <CompareStateTrigger Property="{Binding Source={x:Reference CheckBox2}, Path=IsChecked}"
                                 Value="False" />
          </VisualState.StateTriggers>
          <VisualState.Setters>
            <Setter TargetName="button" 
                    Property="Button.IsEnabled"
                    Value="False" />
          </VisualState.Setters>
        </VisualState>
      </VisualStateGroup>
    </VisualStateGroupList>
  </Setter>
</Style>

Примечание. В Xamarin.Forms 4.5.0.356 StateTriggers и CompareStateTrigger является экспериментальным, поэтому необходимо добавить следующее в App.xaml.cs (в проекте Xamarin.Forms):

public App()
{
    Device.SetFlags(new string[] { "StateTriggers_Experimental" });
    InitializeComponent();
    ...
0 голосов
/ 10 марта 2020

Вы можете использовать MultiTrigger .

MultiTrigger ведет себя аналогично Trigger или DataTrigger, но имеет несколько условий. Все условия должны быть соблюдены, чтобы сеттеры стреляли

<Button Text="Submit" IsEnabled="True">  
    <Button.Triggers>
         <MultiTrigger TargetType="Button">
           <MultiTrigger.Conditions>
              <BindingCondition Binding="{Binding Source={x:Reference CheckBox1}, Path=IsChecked}" Value="False" />
              <BindingCondition Binding="{Binding Source={x:Reference CheckBox2}, Path=IsChecked}" Value="False" />
           </MultiTrigger.Conditions>
           <Setter Property="IsEnabled" Value="False" />
        </MultiTrigger>
    </Button.Triggers>

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