DataTrigger, чтобы сделать кнопку WPF неактивной, пока значение TextBox не станет значимым - PullRequest
7 голосов
/ 11 января 2011

Я хочу, чтобы свойство элемента управления Button было IsEnabled="False", пока значение не будет введено в TextBox в Window.

Код пока:

<Button
  Content="Click Me"
  Name="ClickMe"
  VerticalAlignment="Top"
  Click="ClickMe_Click">
  <Button.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger
          Binding="{Binding ElementName=textBox, Path=Length}"
          <!-- or even: Binding="{Binding Path=textBox.Length}" -->
          Value="0">
          <Setter
            Property="Button.IsEnabled"
            Value="false" />
          </DataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

Кроме того, возможно ли, чтобы это свойство Button элемента управления *1012* основывалось на 3 различных элементах TextBox, все из которых имеют значения?

Ответы [ 3 ]

6 голосов
/ 11 января 2011

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

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding FirstName}" Value="{x:Null}" />
            <Condition Binding="{Binding MiddleName}" Value="{x:Null}" />
            <Condition Binding="{Binding LastName}" Value="{x:Null}" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Button.IsEnabled" Value="False" />
    </MultiDataTrigger>
</Style.Triggers>

При этом, если вы используете модель представления, вы можетевсегда добавляйте bool свойство «EnableSave» и обрабатывайте там всю логику представления, а не в самом представлении.

update

Как видно из комментариев, я ошибочно установил этодо включения Button, когда любой TextBox имеет значение, но требуется, чтобы Button был включен, когда все TextBox es имеют значения.

Концептуально все, что вам нужно сделать, это изменить условия - вместо «ложь, если все условия ложные», мы хотим «истина, если все условия истинны».

Подвох в том, что нетспособ сказать "не нуль" в XAML - никоим образом без IValueConverter, то есть.Я бы создал NullToBoolConverter, который возвращает false для null и true для != null.

Учитывая такой конвертер:

<Style.Triggers>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding FirstName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
            <Condition Binding="{Binding MiddleName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
            <Condition Binding="{Binding LastName,
                Converter={StaticResource NullToBoolConverter}}" Value="True" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Button.IsEnabled" Value="True" />
    </MultiDataTrigger>
</Style.Triggers>
3 голосов
/ 11 января 2011

TextBox не имеет свойства Length. Установка пути привязки к Text.Length может работать.

Но более гибким решением было бы использование Converter , который может возвращать true или false на основании значения строки, переданной в него. Затем вы можете привязать свойство TextBox к тексту следующим образом:

В ресурсах вашего элемента управления:

<localNamespace:MyEmptyStringToBooleanValueConverter x:Key="myValueConverter"/>

Ваше определение DataTrigger тогда выглядит так:

<DataTrigger Binding="{Binding ElementName=textBox, Path=Text, 
                               Converter={StaticResource myValueConverter}}"   
             Value="False">

Что касается вашего второго запроса, вы можете использовать MultiBinding . В этом случае вы должны использовать конвертер значений, чтобы определить, как следует интерпретировать результаты привязки. Подробности смотрите в связанном учебнике.

2 голосов
/ 08 сентября 2015

Использование свойства x: Name = "FirstName" и аналогичным образом для других следующий код будет работать, чтобы включить кнопку, когда данные присутствуют во всех полях.

<Button.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=FirstName,Path=Text.Length, Mode=OneWay}" Value="0">
            <Setter Property="Button.IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding ElementName=MiddleName,Path=Text.Length, Mode=OneWay}"  Value="0">
            <Setter Property="Button.IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding ElementName=LastName,Path=Text.Length, Mode=OneWay}" Value="0">
            <Setter Property="Button.IsEnabled" Value="False" />
            </DataTrigger>                  
         </Style.Triggers>
     </Style>
 </Button.Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...