WPF,MVVM,如何动态绑定属性?

问题描述 投票:1回答:1

我有个问题。如何将变量从ViewModel动态绑定到View?目前,它甚至没有显示出来。如果我不使用Command,它的效果很好(当然,我只能绑定一次图像)。

我的看法:

namespace somestuff.View
{

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

我的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控件。

感谢您的任何建议。

编辑:

我有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
c# wpf mvvm binding
1个回答
1
投票

必须使用属性的名称调用NotifyPropertyChanged,而不是其支持字段的名称。并且为了触发更改通知事件,您必须设置属性,而不是支持字段:

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

DisplayedHighPerformanceImage = method1();
© www.soinside.com 2019 - 2024. All rights reserved.