0

我有一个 WPF 文本框,其 Text 属性绑定到数据源。我还将第二个 TextBox 的 IsEnabled 属性绑定到第一个文本框的 Text.Length 属性,以便在第一个框中没有输入任何内容时禁用第二个框。问题是我希望文本源在属性更改时更新,但 IsEnabled 仅在失去焦点时更新,但我只能为文本正确定义一个 UpdateSourceTrigger。

解决此问题的一种方法是手动启用和禁用先前文本框失去焦点事件的文本框。但是,由于有很多这样的文本框,每个文本框的 IsEnabled 都绑定到前一个框的 Text 属性,这会很混乱。我想知道在 Xaml 中是否有更清洁的方法来执行此操作。

<TextBox Name="box1" Text="{Binding textSource1, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<TextBox Name="box2" IsEnabled="{Binding ElementName=box1, Path=Text.Length}" Text="{Binding textSource2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

在这里,我希望 box2 的 IsEnabled 属性在 box1 失去焦点时更新,但 textSource1 在 box1 上的 Text 属性更改时更新。

4

1 回答 1

2

您可以使用MultiBinding类。

<TextBox Name="box2"  Text="{Binding textSource2, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="321,64,113,217">
        <TextBox.IsEnabled>
            <MultiBinding  Converter="{StaticResource myConv}">
                <Binding ElementName="box1" Path="Text.Length" />
                <Binding ElementName="box1" Path="IsFocused" />
            </MultiBinding>
        </TextBox.IsEnabled>
</TextBox> 

然后您需要一个具有所需自定义逻辑的转换器类

public class MyConverter : IMultiValueConverter
{

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int textLength = (int)values[0];
        bool isFocused = (bool)values[1];

        if (textLength > 0)
            return true;

        if (isFocused == true)
            return true;

        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

}
于 2012-10-25T12:00:28.607 回答