WPFアプリにButtonとTextBoxがあります。ユーザーがTextBoxにテキストを入力するまで、ボタンを無効にするにはどうすればよいですか?
これはそれを行う必要があります:
<StackPanel>
<TextBox x:Name="TheTextBox" />
<Button Content="Click Me">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding Text, ElementName=TheTextBox}" Value="">
<Setter Property="IsEnabled" Value="False" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</StackPanel>
[〜#〜] mvvm [〜#〜] (非常に簡単になります。試してみてください)ViewModelに2つのプロパティがありますText
TextBoxにバインドされており、ボタンにバインドされているICommandプロパティApply
(または同様の)があります。
_<Button Command="Apply">Apply</Button>
_
ICommand
インターフェイスには、CanExecute
if (!string.IsNullOrWhiteSpace(this.Text)
を返すメソッドtrue
があります。残りはWPFによって行われます(有効化/無効化、クリック時に実際のコマンドを実行)。
リンクされた記事で詳細に説明されています。
コード別:
btn_edit.IsEnabled = true;
XAMLの場合:
<Button Content="Edit data" Grid.Column="1" Name="btn_edit" Grid.Row="1" IsEnabled="False" />
私はこれが他の投稿ほどエレガントではないことを知っていますが、同じことを達成する方法のより単純なxaml /コードビハインドの例です。
Xaml:
<StackPanel Orientation="Horizontal">
<TextBox Name="TextBox01" VerticalAlignment="Top" HorizontalAlignment="Left" Width="70" />
<Button Name="Button01" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,0,0,0" />
</StackPanel>
CodeBehind:
Private Sub Window1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Button01.IsEnabled = False
Button01.Content = "I am Disabled"
End Sub
Private Sub TextBox01_TextChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles TextBox01.TextChanged
If TextBox01.Text.Trim.Length > 0 Then
Button01.IsEnabled = True
Button01.Content = "I am Enabled"
Else
Button01.IsEnabled = False
Button01.Content = "I am Disabled"
End If
End Sub
TextChanged
のTextBox
イベントにサブスクライブでき、テキストが空の場合はButton
を無効に設定します。または、Button.IsEnabled
プロパティをTextBox.Text
プロパティ。テキストがある場合はtrueを返し、そうでない場合はfalseを返すコンバーターを使用します。