[WPF C#]调用PropertyChanged函数但不会发生更新

时间:2015-12-14 12:00:25

标签: c# wpf inotifypropertychanged

我的C#代码存在一个小问题,并且绑定了一个属性。

这里我有以下xaml:

<Image Source="{Binding downloaded, Source={StaticResource itemsViewSource}}" Width="20" Height="20" Margin="5" HorizontalAlignment="Right" VerticalAlignment="Top"/>

还有我正在尝试的代码:

class Ressource : INotifyPropertyChanged
{
    public String downloaded        { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        Debug.WriteLine("Property changed.");
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

}

我的问题是调用了NotifyPropertyChanged函数(调试出现),字符串内容被更改但我看不到我的图像。

有没有人能解决这个问题。

谢谢!

编辑: 在多个有用的答案之后,即使调用了propertyChanged函数也没有出现变化,我开始怀疑是否真的可能改变图像源的路径。

路径更改后可以更新图像吗?

以下是建议更改后的代码:

    public class Ressource : INotifyPropertyChanged
    {
    public String downloaded
    {
        get
        {
            return _downloaded;
        }
        set
        {
            _downloaded = value;
            if (PropertyChanged != null)
                PropertyChanged(this,new PropertyChangedEventArgs("downloaded"));
        }
    }

5 个答案:

答案 0 :(得分:2)

您应该更改属性声明,以便可以在View Model中通知视图更改了源属性,并更新控制通知属性的值。

private String _downloaded;
public String downloaded 
{
    get  
    {
      return _downloaded;       
    }  
    set
    {
       _downloaded = value;
       NotifyPropertyChanged("downloaded");
    }
}   

答案 1 :(得分:0)

C#View模型源代码是

class Ressource : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private String _downloaded;
    public string downloaded
    {
        get { return _downloaded; }
        set
        {
            _downloaded= value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("downloaded"));
        }
    }
}

答案 2 :(得分:0)

只有在辅助功能级别为public时才能应用数据绑定。类的默认可访问级别为internal。您尚未应用辅助功能级别,因此您的班级Ressource是内部的。设为public,它应该有效。

public class Ressource : INotifyPropertyChanged

更新1:

如果您的图片已设置为构建操作Resource,则可以尝试使用此字符串:"/AssemblyName;component/Assets/available.png"

或.Net Framework 4.5:

"pack://application:,,,/AssemblyName;component/Assets/available.png"

AssemblyName替换为您的程序集名称(您可以使用Assembly.GetExecutingAssembly().GetName().Name动态获取程序集名称)

答案 3 :(得分:0)

将UpdateSourceTrigger = PropertyChanged添加到绑定。

答案 4 :(得分:0)

好的,这是一个新手的错误,但我更喜欢显示问题是什么,因为我没有找到解释可能出现问题的主题。 但是我自己发现了......我想没有人真的需要它。无论如何:

我还不够清楚。 在我的示例中,我将图像源绑定到Resource类中的下载字段。

问题是资源对象包含在另一个没有实现INotifyPropertyChanged的类中。

有一次,一切正常。

感谢大家一个试图帮助我的人,抱歉为这个小说和缺乏清晰度。

如果有人在努力解决此问题,请执行以下代码:

资源的一部分:

    public class Ressource : INotifyPropertyChanged
{

    private String _downloaded;
    public String downloaded
    {
        get { return this._downloaded; }
        set
        {
            this._downloaded = value;
            raiseProperty("downloaded");
        }
    }
        public event PropertyChangedEventHandler PropertyChanged;

    private void raiseProperty(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

容器:

   class personalSeance : INotifyPropertyChanged
{
        public ObservableCollection<Ressource> listRess { get; set; }
   public event PropertyChangedEventHandler PropertyChanged;

    private void raiseOnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

最简单的绑定:

<Image Source="{Binding downloaded}" Width="20" Height="20" Margin="3" HorizontalAlignment="Right" VerticalAlignment="Top"/>