web-dev-qa-db-ja.com

トリガーから別のコントロールのプロパティにバインドするにはどうすればよいですか?

私の特定のケースでは、TextBoxのIsReadOnlyプロパティにバインドして、ButtonのContentプロパティを設定しますか?どちらも同じStackPanelの一部です。

TextBoxのElementNameにバインドするDataTriggerと、SourceNameとしてTextBox名を使用するトリガーを使用して、これを実行しようとしました。

何かご意見は?

50
rrhartjr

スタイルの一部としてトリガーを指定する必要があります。ボタン自体のトリガーコレクションには、イベントトリガーのみを含めることができます。それを念頭に置いて、DataTriggerは正常に動作します。ただし、しわがあります。トリガーセッターの値は、ローカルのContentプロパティを上書きしません。そのため、スタイルのデフォルトのコンテンツも設定する必要があります。外観は次のとおりです。

<Button>  <!-- Note no content set directly on button -->
  <Button.Style>
    <Style TargetType="Button">
      <Setter Property="Content" Value="You may write!!!" />  <!-- Here is the 'normal' content -->
      <Style.Triggers>
        <!-- Here is how we bind to another control's property -->
        <DataTrigger Binding="{Binding IsReadOnly, ElementName=textBox}" Value="True">
          <Setter Property="Content" Value="NO NO NO" />  <!-- Here is the 'override' content -->
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>
76
itowlson

これを試しましたか:

<StackPanel x:Name="LayoutRoot">
    <Button Width="75" Content="{Binding IsReadOnly, ElementName=textBox, Mode=Default}" />
    <TextBox x:Name="textBox" VerticalAlignment="Top" Text="TextBox" />
</StackPanel>

8
Mark