如何从触发器绑定到另一个控件的属性?

问题描述 投票:0回答:3

在我的特定情况下,我想绑定到 TextBox 的 IsReadOnly 属性来设置 Button 的 Content 属性?它们都是同一个 StackPanel 的一部分。

我尝试使用 DataTrigger 来完成此操作,该 DataTrigger 绑定到 TextBox 的 ElementName,并使用 TextBox 名称作为 SourceName 的触发器。

有什么想法吗?

wpf xaml triggers styles
3个回答
95
投票

您需要将触发器指定为样式的一部分——按钮本身的触发器集合只能包含事件触发器。 考虑到这一点,DataTrigger 就可以正常工作了。 但是,有一个问题:触发器设置器中的值不会覆盖本地内容属性。 因此,您还必须在样式中设置默认内容。 它看起来是这样的:

<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>

8
投票

你试过这个吗:

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

??


0
投票

我将向您展示最简单的,也许不是很干净的解决方案,但这只是为了给您提供想法。出于好奇,我实现了这个效果,但是……

但我的主要建议是:最好不要这样做。默认的弹出行为要好得多。你想要的并不是用户期望的。如果用户单击输入控件,则此人就是这个意思。用户的注意力集中在给定时刻单击的控件上,而不是弹出窗口上。您的弹出窗口是短暂的,因此,当它被隐藏时,这只不过是单击某些控件的副作用。如果您应用您的设计,您只会收到一些控件“并不总是响应式”的抱怨。

现在,一些实施。 XAML:

<Window x:Class="PopupClickProblem.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Popup x:Name="popup" StaysOpen="False" Placement="MousePoint">
        <UniformGrid Background="Red">
            <Button>Btn1</Button>
            <Button>Btn2</Button>
        </UniformGrid>
    </Popup>
    <UniformGrid>
        <Button x:Name="buttonShowPopup">Popup</Button>
        <Button x:Name="buttonPrintMessage">Print Message</Button>
    </UniformGrid>
    <Border x:Name="borderBlocker"
        Background="Black" Opacity="0.15"
        Visibility="Collapsed" />
</Grid>

后台代码:

namespace PopupClickProblem {
using System.Windows;
using Debug = System.Diagnostics.Debug;

public partial class MainWindow : Window {

    public MainWindow() {
        InitializeComponent();
        buttonShowPopup.Click += (sender, eventArgs) => {
            popup.IsOpen = true;
            borderBlocker.Visibility = Visibility.Visible;
        };
        buttonPrintMessage.Click += (sender, eventArgs) => {
            Debug.WriteLine("Test");
        };
        popup.Closed += (sender, eventArgs) => {
            borderBlocker.Visibility = Visibility.Collapsed;
        };
    }  //MainWindow

} //class MainWindow

}

请注意,我显示了半透明着色,您可以使用它来产生在第一次单击之前所有窗口控件均未启用的印象。您可以选择使用或不使用此效果。

您想要更好的设计吗?如果您只禁用一个元素(我命名为

buttonShowPopup
的按钮)会怎样?单击弹出窗口外部后再次显示弹出窗口时,看起来确实很奇怪。您可以在弹出窗口显示时禁用此按钮,然后在
popup.Closed
上再次启用它,这应该足够了。

© www.soinside.com 2019 - 2024. All rights reserved.