我有一个WPF TextBox,Text属性绑定到数据源。我还将第二个TextBox的IsEnabled属性绑定到第一个TextBox的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}"/>
这里我希望box1的isEnabled属性在box1失去焦点时更新,但是当box1上的Text属性发生变化时,textSource1会更新。
答案 0 :(得分: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();
}
}