Простое связывание данных из кода в XAML

2


Я новичок в концепциях WPF. Я хочу просто отобразить строку в текстовом поле. Я попробовал следующий код С# и XAML, чтобы привязать строку к свойству TextBox.Text. Код С#:

public partial class Window1 : Window
{
    public int TmpVal;
    public string TmpStr;

     public Window1()
    {
        TmpVal = 50;
        TmpStr = "Windows Created";
        InitializeComponent();
        this.DataContext = this;
    }
    private void viewButton_Click(object sender, RoutedEventArgs args)
    {
        TmpStr = "Button clicked";
    }
}

}

XAML:

 <Window x:Class="TestWPF.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="600" Width="800" x:Name="ThisWindow">
<Grid>
    <TextBox Name="txtTest1" Margin="200,0,200,200" HorizontalAlignment="Left" Height="50" Width="200" Text="{Binding TmpStr, ElementName=ThisWindow}" />
    <Button Name="butTest1"  Click="viewButton_Click">Test123</Button>
</Grid>
</Window>

При выполнении я всегда получаю пустой текст в своем текстовом поле (даже когда я вызываю событие click).
Я просмотрел сайт stackoverflow, но не смог решить проблему (хотя многие вопросы были близки к этому)
Может кто-нибудь подскажет мне, если что-то упускается из виду или пропущено?

Теги:
xaml
wpf
data-binding

1 ответ

5

Связывание с данными не работает с полями. Вместо этого используйте свойства:

public int TmpVal {get; set;}
public string TmpStr {get; set;}

Кроме того, если вы хотите, чтобы текстовое поле автоматически выбирало изменения из ваших данных, вам в идеале нужно было бы реализовать INotifyPropertyChanged или сделать его зависимым свойством или иметь событие XXXChanged для каждого свойства XXX (это не означает, t больше).

<Window x:Class="WpfApplication5.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" x:Name="ThisWindow">
    <StackPanel>
        <TextBox Name="txtTest1" Text="{Binding TmpStr, ElementName=ThisWindow}" />
        <Button Name="butTest1"  Click="viewButton_Click">Test123</Button>
    </StackPanel>
</Window>

И код позади:

public partial class Window1 : Window, INotifyPropertyChanged
{
    public Window1()
    {
        this.TmpStr = "Windows Created";
        this.InitializeComponent();
        this.DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public string TmpStr { get; set; }

    public int TmpVal { get; set; }

    private void viewButton_Click(object sender, RoutedEventArgs args)
    {
        this.TmpStr = "Button clicked";
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs("TmpStr"));
        }
    }
}
  • 0
    Почему XXXChanged событий больше не работает? Где я могу прочитать об этом?
  • 0
    Я думаю, что это было только в некоторых ОСАГО или ранних бета-версиях v1.
Показать ещё 3 комментария
Сообщество Overcoder
Наверх
Меню