WPF, MVVM, как динамически связывать свойства? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть вопрос. Как динамически привязать переменные из ViewModel в View? На данный момент это даже не отображается. Если я не использую Command, он прекрасно работает (но, конечно, я могу связать изображение только один раз).

Мой Просмотр :

namespace somestuff.View
{

     public partial class WindowView : Window
     {
         public WindowView()
         {
            this.DataContext = new WindowViewModel();
            InitializeComponent();
        }
    }
}

my View.Xaml (сокращено):

<Image Source="{Binding DisplayedImage}"/>
<Button Command="{Binding NewImageCommand}"/>

И мой ViewModel:

public WindowViewModel()
{
    _canExecute = true;
}

public event PropertyChangedEventHandler PropertyChanged;

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

public string DisplayedImage //displaying image
{
    get { return filepath; }

    set { filepath = value; NotifyPropertyChanged(nameof(filepath)); }
}

public string filepath { get; set; } //var for binding


private bool _canExecute;
private ICommand _newImageCommand; //command for button
public ICommand NewImageCommand
{
    get
    {
        return _newImageCommand ?? (_newImageCommand = new Commands.CommandHandler(() => GetImage(), _canExecute));
    }
}

public void GetImage() { filepath = Pictures.GetNewImage(); } //command on button click

Подскажите, почему после запуска команды GetImage() при нажатии кнопки изображение, связанное с Image, не изменилось? Если я перейду filepath = Pictures.GetNewImage(); из команды (более ясно, я не использую команду), все прекрасно работает, но я не могу повторно вызвать привязку к моему изображению. Можете ли вы сказать мне, как динамически привязывать свойства в модель View from View? Когда значение переменной (в данном случае, filepath) изменяется, я хочу изменить и элемент управления View.

Спасибо за любые советы.

EDIT:

У меня есть 6 Image ярлыков. Я отображаю изображения в нем так:

public BitmapImage DisplayedHighPerformanceImage
    {
        get { return kMMHP; }

        set { kMMHP = value; NotifyPropertyChanged(nameof(kMMHP)); }
    }

Так что мне нужно filepath для инициализации 6 различных растровых изображений. Затем я работаю с этими растровыми изображениями (например, это kMMHP). Поэтому я хочу отобразить каждое новое растровое изображение, инициализированное из kMMHP изображения.

kMMHP = method1(); //displaying it
//other stuff do with diffrent bmps
kMMHP = method2(); //displaying it after second method with changed values

1 Ответ

0 голосов
/ 10 сентября 2018

NotifyPropertyChanged должен вызываться с именем свойства, а не с именем его вспомогательного поля. И чтобы запустить событие уведомления об изменении, вы должны установить свойство, а не поле поддержки:

public BitmapImage DisplayedHighPerformanceImage
{
    get { return kMMHP; }
    set { kMMHP = value; NotifyPropertyChanged(nameof(DisplayedHighPerformanceImage)); }
}

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