如果三个选项卡中的三个文本框之一具有内容,则启用按钮

时间:2019-05-17 12:58:50

标签: wpf vb.net data-binding

我有一个位于选项卡控件元素外部的Button。 TabControl上的每个Tab都有一个用于手动输入文本的文本框,或者是一个搜索工具,用于从数据库中查找内容(其值也将被写入选项卡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 个答案:

答案 0 :(得分:1)

#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没有虚拟机或要评估的许多属性

绑定到所有TextBox的TextChanged并评估它们的状态,然后从您的按钮设置IsEnabled(如果要使用Dependency属性)

<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;
//  }
//}