2015-01-23 7 views
2

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

Это не работает: (текст не отображается в текстовом блоке, но функция UpdateConsole срабатывает, хотя, и TextPercentage обновляется, если я нарушу на него)

SmallWindow.xaml:

<Button Content="Button" Click="Button_Click1"/> 
<TextBlock HorizontalAlignment="Left" Text="{Binding TextPercentage}"> 

SmallWindows.xaml.cs (с некоторой несвязанной логики удалены)

public partial class SmallWindow : Window 
{ 
    public SmallWindow() 
    { 
     DataContext = new ViewModel(); 

     private void Button_Click1(object sender, RoutedEventArgs e) 
     { 
     ViewModel mv = new ViewModel(); 
     mv.UpdateConsole(); 
     } 
    } 
} 

ViewModel.cs (с другим несвязанным кодом удалены)

private string textPercentage; 
    public string TextPercentage 
    { 
     get { return textPercentage; } 
     set 
     { 
      textPercentage = value; 
      RaisePropertyChanged("TextPercentage"); 
     } 
    } 
private void RaisePropertyChanged(string propertyName) 
    { 
     // take a copy to prevent thread issues 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

public event PropertyChangedEventHandler PropertyChanged; 

    public void UpdateConsole() 
    { 
     ++_count; 
     TextPercentage= string.Format("{0}", _count); 
    } 

Это работает: (текст отображается в текстовом блоке)

Smallwindow.xaml

<Button Content="Button" Command="{Binding ChangeSongCommand}"/> 
<TextBlock HorizontalAlignment="Left" Text="{Binding TextPercentage}"/> 

SmallWindow. xaml.cs

public partial class SmallWindow : Window 
{ 
    public SmallWindow() 
    { 
     DataContext = new ViewModel(); 
    } 
} 

ViewModel.cs (с другой несвязанной кода удалены)

private string textPercentage; 
    public string TextPercentage 
    { 
     get { return textPercentage; } 
     set 
     { 
      textPercentage = value; 
      RaisePropertyChanged("TextPercentage"); 
     } 
    } 
private void RaisePropertyChanged(string propertyName) 
    { 
     // take a copy to prevent thread issues 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

public ICommand ChangeSongCommand { get { return new RelayCommand(UpdateConsole); } } 

public event PropertyChangedEventHandler PropertyChanged; 

    public void UpdateConsole(object obj) 
    { 
     ++_count; 
     TextPercentage= string.Format("{0}", _count); 
    } 

Итак, главное различие, а второй, который работает, запускается с помощью ICommand.

Борьба с этим весь день, и я не знаю, почему это происходит? бит начинающего, так ответьте, пожалуйста, простые слова :)

ответ

2

Причины вы не вызывая метод на праве объекта:

// Create a separate view model object, which the current view is not bound to 
ViewModel mv = new ViewModel(); 
mv.UpdateConsole(); 

Это создает новый объект и вызывает UpdateConsole на нем, но вид WPF смотрит на экземпляр ViewModel, на который ссылается свойство DataContext.

Что вы хотите:

// Get the view model object the view is presently bound to 
ViewModel mv = (ViewModel)DataContext; 
mv.UpdateConsole(); 
+0

Здравствуйте! Да, это работает! Для бонусных очков я пытаюсь сделать то же самое из другого класса. (Отдельный класс, а не код xaml, но DataContext не найден, где я могу получить этот DataContext или что-то еще? –

+1

Эта общая проблема называется «разрешение зависимостей», и есть ряд подходов, которые вы можете предпринять Чтобы справиться с этим, две основные категории помещают объект, к которому вы хотите получить доступ (зависимость) где-нибудь, где вы всегда можете его найти, например статическое поле (например, глобальное разрешение), или каким-либо образом построить объект, зависимость (инверсия зависимостей). У каждого из них есть недостатки: жесткая связь и сложность соответственно. Для небольших проектов статические поля работают отлично, но для больших проектов вам, скорее всего, понадобится инверсия зависимостей. – codekaizen