Кнопка включения, если в одном из трех текстовых полей на 3 вкладках есть содержимое

У меня есть кнопка, которая живет за пределами элемента управления вкладкой. Каждая вкладка в TabControl имеет либо текстовое поле для ручного ввода текста, либо средство поиска для поиска чего-либо из базы данных (значение которого также будет записано в метку на вкладках 2 и 3).

Я хочу включить кнопку «Печать», если в текстовом поле есть содержимое, или в переменной, заполненной запросом базы данных на выбранной вкладке, есть содержимое.

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

Есть идеи? Я действительно новичок в привязке данных, и я изо всех сил пытаюсь понять некоторые концепции.

Не помогает то, что серверная часть находится в VB, потому что я портирую ряд приложений WinForms на WPF, и я хочу сделать их правильно.

Быстрый XAML:

<Window x:Name="Main1" x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" SizeToContent="Height"> <Grid> <StackPanel > <Grid x:Name="Activity" Margin="5,5,5,0" > <StackPanel> <TabControl x:Name="Main_Tabs" Background="{x:Null}" BorderBrush="Gainsboro"> <TabItem x:Name="T1" Header="H1" > <Grid Margin="5"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20*"/> <ColumnDefinition Width="80*"/> </Grid.ColumnDefinitions> <Label Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right">Address:</Label> <TextBox x:Name="Single_Address" Margin="5,3" SpellCheck.IsEnabled="True" IsManipulationEnabled="True" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.Column="1" Grid.Row="2" Language="en-GB" Height="80"> </TextBox> </Grid> </TabItem> <TabItem x:Name="T2" Header="H2" > <Grid Grid.ColumnSpan="2" Grid.Row="1" x:Name="Grid_Elucid_Label2"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20*"/> <ColumnDefinition Width="80*"/> </Grid.ColumnDefinitions> <Label Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right">Address:</Label> <Label x:Name="Elucid_Address" Margin="5,3" Grid.Column="1" Grid.Row="2" Height="80"> </Label> </Grid> </TabItem> <TabItem x:Name="T3" Header="H3"> <Grid x:Name="Grid_Sage_Label" Margin="5"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="20*"/> <ColumnDefinition Width="80*"/> </Grid.ColumnDefinitions> <Label Grid.Column="0" Grid.Row="2" HorizontalAlignment="Right">Address:</Label> <Label x:Name="Sage_Address" Margin="5,3" Grid.Column="1" Grid.Row="2" Height="80"> </Label> </Grid> </TabItem> </TabControl> </StackPanel> </Grid> <Button x:Name="Print_Button" Content="Print" Padding="10" Background="{x:Null}" BorderBrush="Gainsboro" /> </StackPanel> </Grid> </Window> 

Всего 1 ответ


Виртуальная машина # 1 с несколькими текстовыми свойствами для оценки

если у вас есть только несколько свойств текста и вы используете виртуальную машину, вы можете использовать несколько триггеров. Я написал это от руки, поэтому извините, если синтаксис не соответствует 100%.

<button content="print">
  <button.style>
    <style targettype={x:type button}>
      <style.triggers>
        <multidatatrigger>
          <multidatatrigger.conditions>
            <condition Binding="{Binding VMprop1}" Value="">
            <condition Binding="{Binding VMprop2}" Value="">
            <condition Binding="{Binding VMprop3}" Value="">
          </multidatatrigger.conditions>
          <multidatatrigger.setters>
            <setter property="IsEnabled" value="false"/>
          </multidatatrigger.setters>
        </multidatatrigger>
      </style.triggers>
    </style>
  </button.style>
<button>

2 нет ВМ или много свойств для оценки

привязать к TextChanged всех TextBox и оценить их состояние и установить IsEnabled от вашей кнопки (если вы хотите использовать свойство зависимости)

<button x:Name="btn1" content="print"/>
<textbox x:Name="tb1" TextChanged="EvaluateTextChanged"/>
<textbox x:Name="tb2" TextChanged="EvaluateTextChanged"/>
<textbox x:Name="tb3" TextChanged="EvaluateTextChanged"/>
<textbox x:Name="tb4" TextChanged="EvaluateTextChanged"/>
...

private void EvaluateTextChanged() {
  if (string.isNullOrEmpty(tb1.Text) &&
      string.isNullOrEmpty(tb2.Text) &&
      ...)
  {
    btn1.IsEnabled = false;
  }
}

Есть идеи?

10000