2017-01-24 5 views
0

Я знаю, вы сказали бы, что этот вопрос дублируется, но я не нашел никакого рабочего решения. Так простой сценарий:Привязать TextBox к свойству объекта в WPF

У меня есть текстовое поле и кнопка:

<TextBox x:Name="textbox" Text="{Binding st.SomeText}"> 
<Button Click="Button_Click">Push</Button> 

У меня есть класс с именем что-то:

public class Something 
{ 
    public string SomeText { get; set; } 
} 

У меня есть объект в классе MainWindow:

public partial class MainWindow : Window 
{ 
    Something st; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     st = new Something(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(st.SomeText); 
    } 
} 

Поэтому я хочу напечатать что-то в текстовом поле, нажать кнопку и получить сообщение содержит текст текстового поля, но вместо этого я получаю пустые сообщения. Что следует изменить?

Многие «решения» сказали, что используют стеке или что-то еще, и задают DataContext, но это тоже не сработало.

+0

Пожалуйста, проверьте, как сделать привязку. http://www.wpf-tutorial.com/data-binding/introduction/ – Prajwal

+0

Получить базовое понимание из [Обзор привязки данных] (https://msdn.microsoft.com/en-us/library/ms752347%28v = vs.110% 29.aspx) статья о MSDN. – Clemens

ответ

0

Вы должны сначала установить DataContext свойства экземпляр вашего ViewModel, который в данном случае является SomeThing классом, поэтому вам необходимо установить контекст в CodeBehind из xaml формы, как:

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Something st = new Something(); 
     this.DataContext = st; 
    } 

} 

и то на ваш взгляд, то есть XAML файл, который вы можете установить связывание элемента управления, который особенно свойство связывать для текстового поля, как:

<TextBox x:Name="textbox" Text="{Binding SomeText}"> 

и вы должны использовать Commands вместо использования событие Click для кнопок, если вы хотите, чтобы в вашем приложении WPF был правильный шаблон MVVM.

Вы можете посмотреть на How to Implement MVVM in WPF

+0

ОК, мне пришлось установить DataContext в codeBehind.Интересно, как я могу сделать это в представлении, хотя ... :) Но у меня есть основная базовая (не эта базовая) программа для начала. Спасибо. – user3567816

0

Как вы настраивали контекст данных?

Контекст данных - это где WPF ищет привязки. Кажется, вы пытаетесь привязать свой код к коду, и в этом случае вам нужно установить свой DataContext для самого объекта и изменить поле st на свойство.

private Something _st; 
public Something st 
{ 
    get 
    { 
     return _st; 
    } 
    set 
    { 
     _st = value; 
     OnNotifyPropertyChanged("st"); 
    } 
} 

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
    st = new Something(); 
} 

Однако, если вы всегда желая связываться с вещами внутри й, это могло бы иметь больше смысла, чтобы установить контекст данных на что-то сразу:

public MainWindow() 
{ 
    InitializeComponent(); 
    st = new Something(); 
    this.DataContext = st ; 
} 

и просто связывать, как это:

<TextBox Text="{Binding SomeText}"> 

Это означает, что вам не нужно осуществить INotifyPropertyChanged, или ЗБ как общественная собственность на вашем окне (Но вы должны на что-то, запуская уведомление об изменении в сеттер SOMETEXT).

+0

Ваш первый пример также требует, чтобы 'st' - это публичное свойство, а не поле. – Clemens

+0

К сожалению, моя ошибка - не заметила, что это поле! – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^