Я пытаюсь получить некоторую привязку данных для работы в моем приложении, но у меня много проблем. Вот один пример:Странное поведение привязки данных 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.
Борьба с этим весь день, и я не знаю, почему это происходит? бит начинающего, так ответьте, пожалуйста, простые слова :)
Здравствуйте! Да, это работает! Для бонусных очков я пытаюсь сделать то же самое из другого класса. (Отдельный класс, а не код xaml, но DataContext не найден, где я могу получить этот DataContext или что-то еще? –
Эта общая проблема называется «разрешение зависимостей», и есть ряд подходов, которые вы можете предпринять Чтобы справиться с этим, две основные категории помещают объект, к которому вы хотите получить доступ (зависимость) где-нибудь, где вы всегда можете его найти, например статическое поле (например, глобальное разрешение), или каким-либо образом построить объект, зависимость (инверсия зависимостей). У каждого из них есть недостатки: жесткая связь и сложность соответственно. Для небольших проектов статические поля работают отлично, но для больших проектов вам, скорее всего, понадобится инверсия зависимостей. – codekaizen