WPF-контроль привязки к одной переменной - PullRequest
0 голосов
/ 12 июня 2018

Я не могу связать значение элемента управления с объектом.Я хочу привязать TextBox к string объекту, идея состоит в том, что при изменении текста текстового поля он также должен автоматически изменять объект.не мог понять, что я делаю не так.Вот что я попробовал:

MainWindow.xaml.cs:

public partial class MainWindow : Window
    {
        string str;
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = str;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {

    }
}

и MainWindow.xaml:

<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="150">
    <Grid Margin="0,0,642,319">
        <TextBox HorizontalAlignment="Left" Height="23"  TextWrapping="Wrap" Text="{Binding str}" VerticalAlignment="Top" Width="120" Margin="0,0,-120,-46" />
        <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click" Height="23" Margin="0,28,-75,-51" RenderTransformOrigin="0.423,2.257" />

    </Grid>
</Window>

Итак, когда я что-то ввожу втекстовое поле и нажмите кнопку, я должен видеть текст в str во время отладки, но это всегда null

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Во-первых, привязки данных в WPF работают только с открытыми свойствами.Таким образом, вы должны явно объявить один в своем коде (вместо string str;)

public string str { get; set; }

Во-вторых, свойство DataContext представления определяет объект / класс, в котором будет выполняться поиск свойства дляпривязок.Линия this.DataContext = str; в вашем примере означает, что вы хотите, чтобы ваши привязки в представлении просматривались внутри объекта str (который является string).Вам следует заменить эту строку на

this.DataContext = this;

, чтобы поиск связывался в коде позади этого представления.

Примечание Вы могли также остается со строкой this.DataContext = str;, если str является общедоступным свойством, и связывается с помощью выражения, например

<TextBox Text="{Binding .}" />

, которое будет привязано к значению свойства DataContext.

0 голосов
/ 12 июня 2018

Возможно, вы можете использовать MVVM light для связывания.

0 голосов
/ 12 июня 2018
  1. Измените str на свойство auto:

    public string str {get;задавать;}

  2. Измените DataContext на:

    DataContext = this;

DataContext - это класс, который будет содержать вашу привязкусвойства / команды / события.Свойства / команды / события должны быть общедоступными, чтобы они были доступны вашему представлению.

Чтобы двусторонняя привязка работала, вы должны уведомить привязку пользовательского интерфейса о том, что свойство было изменено и длячто вам нужно реализовать интерфейс INotifyPropertyChanged для класса, который содержит свойства, которые были связаны в пользовательском интерфейсе.Вам понадобится частная собственность, и вы не можете уведомлять об этом автоматически.

Простой пример:

public class Sample : INotifyPropertyChanged
{
    private string _str;
    public string Str
    {
        get { return _str; }
        set
        {
            _str = value;
            NotifyPropertyChanged(nameof(Str));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...