TextBlock не обновляется с использованием свойства ViewModel - PullRequest
0 голосов
/ 06 января 2020

Я работаю над небольшим wpf-приложением, я показываю статус, используя текстовый блок, и для достижения этого я привязал свойство из модели представления. Я сопоставил все, несмотря на то, что этот интерфейс не показывает никакого значения. Я вставляю код, как показано ниже.

App.xaml.cs

public LogViewModel LogTextVm { get; set; }

ViewModelLocator.cs

App thisApp = (App)Application.Current;
public ViewModelLocator()
{
    thisApp.LogTextVm = new LogViewModel();
}

LogViewModel.cs

public class LogViewModel : INotifyPropertyChanged
{
    private string _logText { get; set; }
    public string LogText
    {
        get => _logText;
        set
        {
            if(_logText!=value)
            {
                _logText = value;
                OnPropertyChnaged("LogText");
            }
        }
    }
    private void OnPropertyChnaged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

MainWindow.xaml

xmlns:vm="clr-namespace:MyApplication.ViewModels"
<Window.Resources>
    <vm:ViewModelLocator x:Key="Locator"/>
</Window.Resources>

<TextBlock Grid.Column="0" Text="{Binding LogText, Mode=TwoWay}" DataContext="{Binding LogViewModel, Source={StaticResource Locator}}"
                       FontFamily="segoe UI" FontWeight="SemiBold" FontStyle="Italic" Foreground="White" />

MainWindow.xaml.cs

private App thisApp = (App)Application.Current;
public MainWindow()
{
     InitializeComponent();
}
private async void CallGraphButton_Click(object sender, RoutedEventArgs e)
{
     thisApp.LogTextVm.LogText = "Status : Loading data ...";
}

Кто-нибудь может мне помочь, где я делаю ошибку?

1 Ответ

2 голосов
/ 06 января 2020

Вы должны присвоить MainWindow.DataContext тому же экземпляру LogViewModel, который создан ViewModelLocator

DataContext="{Binding LogViewModel, Source={StaticResource Locator}}", может ли он создать новый экземпляр ViewModelLocator (и, следовательно, новый LogViewModel)?

Пожалуйста, поставьте точку останова в строке thisApp.LogTextVm = new LogViewModel(); и проверьте, выполняется ли она дважды?

UPD Выход VS показывает ошибку привязки для вашего кода

System.Windows.Data Error: 40 : BindingExpression path error: 'LogViewModel' property not found on 'object' ''ViewModelLocator' (HashCode=37320431)'. BindingExpression:Path=LogViewModel; DataItem='ViewModelLocator' (HashCode=37320431); target element is 'StackPanel' (Name=''); target property is 'DataContext' (type 'Object')

Вы привязываетесь к неправильным именам, к сожалению. Чтобы исправить привязку, мне пришлось изменить код, как показано ниже:

ViewModelLocator

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        App thisApp = (App)Application.Current;
        LogTextVm = new LogViewModel();
        thisApp.LogTextVm = LogTextVm;
    }

    public LogViewModel LogTextVm { get; set; }

}

MainWindow.xaml

<Grid>
    <StackPanel  DataContext="{Binding LogTextVm, Source={StaticResource Locator}}">
        <TextBlock  Text="label:" />
        <TextBlock  Text="{Binding LogText, Mode=TwoWay}" />
        <Button Content="click" Click="Button_Click" />
    </StackPanel>
</Grid>

DataContext="{Binding LogTextVm, Source={StaticResource Locator}}"> создает ViewModelLocator экземпляр и связывает StackPanel.DataContext со свойством ViewModelLocator.LogTextVm.

<TextBlock Text="{Binding LogText, Mode=TwoWay}" /> привязывается к LogText для текущего DataContext (который является LogTextVm значением свойства)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...