首页 > 解决方案 > 如果 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>

标签: wpfvb.netdata-binding

解决方案


#1 需要评估的文本属性很少的 VM

如果您只有几个文本属性并使用虚拟机,则可以使用一些触发器。我是手写的,所以如果语法不是 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 没有 VM 或很多属性需要评估

绑定到所有 TextBoxes 的 TextChanged 并评估它们的状态,并从您的按钮设置 IsEnabled(如果您想使用依赖属性)

<button x:Name="btn1" content="print" IsEnabled="{Binding CanPrint}"/>
<textbox x:Name="tb1" TextChanged="EvaluateCanPrint"/>
<textbox x:Name="tb2" TextChanged="EvaluateCanPrint"/>
<textbox x:Name="tb3" TextChanged="EvaluateCanPrint"/>
<textbox x:Name="tb4" TextChanged="EvaluateCanPrint"/>
...

private void EvaluateCanPrint() {
  // ViewModel.EvaluateCanPrint();
  ViewModel.CanPrint = 
    !string.isNullOrEmpty(tb1.Text) &&
    !string.isNullOrEmpty(tb2.Text) &&
      ...;
}

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

推荐阅读