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

时间:2018-09-10 18:26:51

标签: c# wpf mvvm binding

我有一个问题。如何将变量从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模型动态地将属性绑定到View吗?当变量的值(在这种情况下是文件路径)的值更改时,我也想更改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

1 个答案:

答案 0 :(得分:1)

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

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

DisplayedHighPerformanceImage = method1();