绑定到Properties.Settings.Default.myString的文本框文本不会更新myString

时间:2015-03-14 11:41:45

标签: c# wpf xaml data-binding

我有一个字符串Properties.Settings.Default.myString和两个TextBoxes

<TextBox x:Name="textBox1" Text="{Binding myString}"/>
<TextBox x:Name="textBox2" Text="{Binding myString}"/>

当我在 textBox1 中输入文字并更改焦点时, textBox2 中的文字会使用我刚刚在 textBox1 中输入的文字进行更新。< / p>

让我感到困惑的是Properties.Settings.Default.myString永远不会更新我在任何一个TextBox中输入的文本。我确实通过在更改后检查调试器中的myString来确认这一点。

我的问题是,为什么textBox中的这种变化没有反映在绑定变量myString中?

完成XAML(WPF-App):

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:textBoxDataBinding"
    xmlns:Properties="clr-namespace:textBoxDataBinding.Properties" x:Class="textBoxDataBinding.MainWindow"

    mc:Ignorable="d"
    Title="MainWindow" Height="212" Width="318">
<Window.DataContext>
    <Properties:Settings/>
</Window.DataContext>
<Grid>

    <TextBox x:Name="textBox1" Text="{Binding myString}"/>
    <TextBox x:Name="textBox2" Text="{Binding myString}"/>

    <!-- Button does: textBlock.Text = Properties.Settings.Default.myString; -->
    <Button x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="10,157,0,0" VerticalAlignment="Top" Width="75" Click="button1_Click"/>
    <TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="90,161,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
</Grid>

1 个答案:

答案 0 :(得分:3)

修改

您没有绑定Default单例设置,而是创建一组新设置。你需要绑定的是Settings.Default单例实例。

E.g。

 <Window DataContext="{x:Static properties:Settings.Default}">

替代解决方案:

<TextBox x:Name="textBox1" Text="{Binding Default.myString}"/>
<TextBox x:Name="textBox2" Text="{Binding Default.myString}"/>

历史原因的第一个答案:


您需要绑定到Defaul属性 你需要确保

  1. DataContext是您的Properties.Settings.Default对象。
  2. 将绑定源设为Properties.Settings.Default
  3. 这对我有用:

    <StackPanel>
        <TextBox Text="{Binding Path=myStrring,Source={x:Static properties:Settings.Default}}"></TextBox>
        <TextBox Text="{Binding Path=myStrring,Source={x:Static properties:Settings.Default}}"></TextBox>
    </StackPanel>
    

    或更清晰的语法:

    <Window x:Class="WpfApplication1.SO29048483"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:properties="clr-namespace:WpfApplication1.Properties"
            Title="SO29048483" Height="300" Width="300">
        <StackPanel DataContext="{x:Static properties:Settings.Default}">
            <TextBox Text="{Binding myStrring}" />
            <TextBox Text="{Binding myStrring}" />
        </StackPanel>
    </Window>
    

    如果你想在失去焦点之前修改它:

        <TextBox Text="{Binding myStrring, UpdateSourceTrigger=PropertyChanged}" />