一个TextBox上有两种绑定?

时间:2014-02-19 08:37:46

标签: c# .net wpf xaml wpf-controls

目前我有以下绑定:

        <TextBox Text="{Binding Mode=TwoWay, Path=SearchText, UpdateSourceTrigger=LostFocus}">

在代码中,当搜索文本发生变化时,我正在执行昂贵的,长时间运行的操作,因此触发器设置为LostFocus,以便仅在用户点击enter或tab后执行该操作。

我想在该文本框中的文本非空时另外启用另一个控件。

我可以在TextBox中使用第二个绑定,还是将其他控件直接绑定到XAML中我文本框的当前内容。?

3 个答案:

答案 0 :(得分:1)

您可以将其他控件绑定到Text的{​​{1}}属性。有了这个,当TextBox属性改变时,其他控件将立即受到影响,甚至在LostFocus事件引发之前:

Text

答案 1 :(得分:1)

首先 UpdateSourceTrigger默认值为LostFocus您不必手动执行此操作。此外,对于Text DP,默认模式为TwoWay,您也可以省略它。

其次,UpdateSourceTrigger表示绑定的源值应该更新哪个操作。所以,你肯定可以启用/禁用另一个控件,为此你需要绑定另一个控件。

这将起作用,因为当源属性即文本DP发生变化时,DP(即IsEnabled)与另一个控件的绑定会更新。

    <StackPanel>
        <TextBox x:Name="txt" Text="{Binding SearchText}"/>
        <Button Content="TestButton"
                IsEnabled="{Binding ElementName=txt, Path=Text,
                            Converter={StaticResource StringToBoolConverter}}"/>
    </StackPanel>

答案 2 :(得分:0)

嗨我自己没有太多使用绑定,我理所当然地做了一个小的多绑定实验,只是为了让绑定概念有点苦涩。

这应该澄清一下绑定如何对你的优势起作用:

  <StackPanel>
    <Slider Name="SliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10" TickFrequency="1" TickPlacement="TopLeft" IsSnapToTickEnabled="True" />
    <TextBox Name="TextBoxTextContent" Margin="5" Text="Denne tekst er en test" />
    <ListBox Name="ListBoxColors" BorderBrush="Black" Margin="5" >
        <ListBoxItem Tag="Red" Content="Red" ></ListBoxItem>
        <ListBoxItem Tag="Yellow" Content="Yellow" ></ListBoxItem>
        <ListBoxItem Tag="Green" Content="Green" ></ListBoxItem>
    </ListBox>
    <TextBlock Margin="3" Name="TextBlockSampleText" Height="50" FontSize="{Binding ElementName=SliderFontSize, Path=Value, Mode=TwoWay}"  
               Text="{Binding ElementName=TextBoxTextContent, Path=Text}" Foreground="{Binding ElementName=ListBoxColors, Path=SelectedItem.Tag}" />
    <StackPanel Orientation="Horizontal">
        <TextBlock Name="TextBlockExactSize" Text="Exact Size:" VerticalAlignment="Center" />
        <!-- I .Net 4.5 er der mulighed for at smide en delay property på som starter hvergang der er foretaget en ændring, men updater først
             sourcen når delay tiden er nået. og resetter hver gang der foretages en ny ændring. Delay=500 (halvt sekundt) -->
        <TextBox Name="TextBoxExactSize" Text="{Binding ElementName=TextBlockSampleText, Path=FontSize, Mode=TwoWay, UpdateSourceTrigger=Explicit}" 
                 HorizontalAlignment="Left" Width="100" Margin="10 5" TextChanged="TextBoxExactSize_TextChanged" />
    </StackPanel>
    <Button Name="ButtonClose" IsCancel="True" Content="Close" HorizontalAlignment="Right" Height="30" Width="100" Margin="5" Click="ButtonClose_Click" />
</StackPanel>

在代码背后:

private void TextBoxExactSize_TextChanged(object sender, TextChangedEventArgs e)
{
  pm_RetrievedBindingExpression = TextBoxExactSize.GetBindingExpression(TextBox.TextProperty);
  pm_RetrievedBindingExpression.UpdateSource();
}

//如果UpdateSourceTrigger设置为'Explicit',则此方法是必需的。这样,您可以在事件中执行一些代码,并在方法完成其工作时更新源代码。如果您不喜欢这种行为,可以将Explicit更改为PropertyChanged,它会在发生更改时立即更新您的属性。

只需创建一个新的窗口c / p,然后玩它。希望这会有所帮助:)

相关问题