2017-01-04 5 views
0

Я только начал изучать настольное приложение WPF. Я написал несколько слов, например, простой код, чтобы выполнить операцию привязки.Элементы управления привязкой WPF

Проблема в следующем: Я хотел тип sth в TextBox и видеть его одновременно в TextBlock, но после компиляции и запуска приложения элементы управления в форме не ведут себя так, как я описал.

Может ли кто-нибудь помочь мне исправить это?

MainWindow.xaml:

<Window x:Class="Napisy.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:Napisy" 
     xmlns:mv="clr-namespace:Napisy.ModelWidoku" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <mv:NapisyModelWidoku x:Key="napisyModelWidoku"/> 
    </Window.Resources> 

    <Grid DataContext="{StaticResource napisyModelWidoku}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="2*"/> 
      <RowDefinition Height="2*"/> 
      <RowDefinition Height="1*"/> 
     </Grid.RowDefinitions> 
     <TextBox Grid.Row="1" Margin="10,10,10,10" Text="{Binding Path=Tekst,Mode=TwoWay}"/> 
     <TextBlock Grid.Row="2" Margin="10,10,10,10" Text="{Binding Path=Wyswietl,Mode=OneWay}"/> 
    </Grid> 
</Window> 

ViewModel код:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Napisy.Model; 
using System.ComponentModel; 

namespace Napisy.ModelWidoku 
{ 
    public class NapisyModelWidoku : INotifyPropertyChanged 
    { 
     NapisyModel model = new NapisyModel(); 

     public string Tekst 
     { 
      get 
      { 
       return model.Tekst; 
      } 
      set 
      { 
       model.Tekst = value; 
       OnPropertyChanged(nameof(Tekst)); 
       OnPropertyChanged(nameof(Wyswietl)); 
      } 
     } 
     public string Wyswietl 
     { 
      get 
      { 
       return model.Tekst; 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 

     void OnPropertyChanged(string nazwa) 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nazwa)); 
     } 
    } 
} 

Код модели:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Napisy.Model 
{ 
    public class NapisyModel 
    { 
     public string Tekst { get; set; } 
    } 
} 

EDIT:

  • Описание проблемы,
  • перед классом NapisyModelWidoku, Вход в помещение Модификатор общественности добавил,
  • добавил OnPropertyChanged (nameof (TEKST));
  • вместо OnPropertyChanged ("Wyswietl"); используется OnPropertyChanged (nameof (Wyswietl));

После ввода текста в TextBox все еще TextBlock не обновляется автоматически. Еще надеюсь, что я получаю советы. Спасибо

+0

* "не ведут себя, как я предполагал «* - на самом деле не является хорошим описанием проблемы. Что не работает? Я вижу, что вы забыли выпустить уведомление для самого Tekst: 'OnPropertyChanged (nameof (Tekst));' – Sinatr

+0

EDIT: «класс NapisyModelWidoku» изменен на «публичный класс NapisyModelWidoku». Все еще не работает. –

ответ

0

Наряду с добавлением UpdateSourceTrigger в обоих переплетах, сделать ниже изменения также,

public string Tekst 
    { 
     get 
     { 
      return model.Tekst; 
     } 
     set 
     { 
      model.Tekst = value; 
      OnPropertyChanged("Tekst"); 
      OnPropertyChanged("Wyswietl"); 
     } 
    } 
+0

Я выполнил все ваши предложения. В коде все еще есть ошибка. –

+0

Вы добавили UpdateSoureTrigger в оба привязки? потому что он отлично работает для меня. – WPFUser

+0

Я добавил только в TextBlock по ошибке. Когда я помещаюсь в TextBox и TextBlock, он работает. Спасибо! :) –

0

Я запустил ваш код, и он не работает, потому что PropertyChanged имеет значение NULL. Вы должны установить datacontext вашего представления так, чтобы PropertyChangedEventHandler мог быть привязан.

Добавить в коде позади, т.е. MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new NapisyModelWidoku(); 
} 
+0

Без изменений после добавления UpdateSourceTrigger = PropertyChanged –

+0

Да Я выяснил проблему, позвольте мне внести изменения в мой ответ –

+0

или вы можете установить DataContext для объекта NapisyModelWidoku в xaml. –

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