обновление изображения из дочерней панели wpf

Рейтинг: 0Ответов: 1Опубликовано: 25.08.2023

Не могу обновить изображение через MVVM.

WPF изучаю от силы 4 дня.

Часть кода формы:

<Ellipse Height="200" Width="200" Margin="8,10,8,349">
<Ellipse.Fill>
    <ImageBrush x:Name="usprof" Stretch="UniformToFill" ImageSource="{Binding CurrentAvatar}"/>
</Ellipse.Fill>

MVVM:

public RelayCommand ChangeAvatarCommand { get; set; }

 private object? _currentAvatar;
 public object? CurrentAvatar
 {
     get { return _currentAvatar; }
     set { _currentAvatar = value; OnPropertyChanged(); }
 }

 public MainViewModel() 
 {
     ChangeAvatarCommand = new RelayCommand(o =>
     {
         CurrentAvatar = UserData.AvatarPath; // Код срабатывает, но изображение не меняется
     });
 }

UPD:

Если необходимо, то вот код кнопки из другой панели:

<Button x:Name="selectBtn" Command="{Binding ChangeAvatarCommand}" Click="selectBtn_Click" Content="Select" VerticalAlignment="Center" Foreground="White" FontSize="15" Margin="10 0 0 0" Width="100" BorderThickness="0" Style="{StaticResource stdButton}"/> 

Также в отдельном StackPanel

Выбор изображения по кнопке:

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "PNG files(*.png)|*.png|JPG files(*.jpg)|*.jpg|All files(*.*)|*.*";
if (ofd.ShowDialog().Value)
{
    avatarPath.Text = ofd.FileName;
    UserData.AvatarPath = ofd.FileName;
}

OnPropertyChanged:

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged([CallerMemberName] string? name = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}

RelayCommand:

class RelayCommand : ICommand
{
    private Action<object> _execute;
    private Func<object, bool> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) 
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public void Execute(object parameter) { _execute(parameter); }
}

Ответы

▲ 0

Оказывается, мое приложение просто не вызывало событие обновления изображения (решил костылём). Спасибо большое Евгению за информацию.

Костыль:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    username.Text = UserData.Login;
    Task.Run(() => 
    {
        string pathNow = string.Empty;
        while (true)
        {
            if (pathNow != UserData.AvatarPath)
            {
                pathNow = UserData.AvatarPath;
                ChangePic();
            }

            Thread.Sleep(150);
        }
    });
}

private void ChangePic()
{
    if (UserData.AvatarPath != string.Empty)
    {
        Dispatcher.Invoke(new Action(() => usprof.ImageSource = new BitmapImage(new Uri(UserData.AvatarPath, UriKind.Relative))));
    }
    else { Dispatcher.Invoke(new Action(() => usprof.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Resources/avatar.png")))); }
}

В итоге MVVM можно отложить... То еще Г, но всё же.

Ссылка на пример: https://mega.nz/file/l6oizZTJ#26vag4RcjkuYbFuOQDw85q5d9m3PXyrPKOTkddRYJ5w