WPF - привязка данных - без обновлений даже с INotifyPropertyChanged - PullRequest
0 голосов
/ 21 февраля 2020

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

Намерение состоит в том, чтобы просто получить текущее системное время по Datetime.Now и показывать его в Textblock, обновляемом каждые 500 мс. , - Я просто хочу протестировать среду, в которой код выполняется и обрабатывается за окном, чтобы получить / рассчитать последние данные и отобразить их в окне.

Однако, с помощью простого кода ниже, текст в окне просто получите время один раз и никогда не обновляйтесь, пока работает l oop и обновляется "ClockText".

Я уверен, что допустил глупую ошибку, но не смог найти неправильную точку , Пожалуйста, помогите мне!

[MainWindow.xaml]

<Window x:Class="wpfTest.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:wpfTest"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <TextBlock HorizontalAlignment="Center" TextWrapping="Wrap"  VerticalAlignment="Center" FontSize="40"
               Text="{Binding ClockText, UpdateSourceTrigger=PropertyChanged}" />

</Grid>

[MainWindow.xaml.cs]

public partial class MainWindow : Window
{
    private Clock clk;
    public MainWindow()
    {
        InitializeComponent();
        clk = new Clock() { ClockText = "HH:MM:SS" };
        this.DataContext = clk;
        clk.ClockLogic(ref clk);
    }
}
public class ClockViewModel : INotifyPropertyChanged
{
    private string clockText;
    public string ClockText
    {
        get { return clockText; }
        set
        {
            clockText = value;
            NotifyPropertyChanged("ClockText");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged == null)
        {
            return;
        }
        PropertyChanged(this, new PropertyChangedEventArgs(info));

    }
}

public class Clock
{
    public string ClockText { get; set; }
    public async void ClockLogic()
    {
        while (true)
        {
            ClockText = DateTime.Now.ToString();
            Console.WriteLine(ClockText); // for debug
            await Task.Delay(500);
        }
    }
}

}

1 Ответ

1 голос
/ 21 февраля 2020

Поскольку вы связываетесь со свойством ClockText Clock, а не с ClockViewModel, классу Clock необходимо реализовать INotifyPropertyChanged и вызывать событие PropertyChanged для свойства ClockText всякий раз, когда Вы устанавливаете это:

public class Clock : INotifyPropertyChanged 
{
    private string clockText;
    public string ClockText
    {
        get { return clockText; }
        set
        {
            clockText = value;
            NotifyPropertyChanged(nameof(ClockText));
        }
    }

    public async void ClockLogic()
    {
        while (true)
        {
            ClockText = DateTime.Now.ToString();
            Console.WriteLine(ClockText); // for debug
            await Task.Delay(500);
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }

}

Вы, кажется, не инициализируете и не используете свой класс ClockViewModel где-то.

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