[WPF C#]PropertyChanged 函数已调用但未发生更新
[WPF C#]PropertyChanged function called but update does not happen
我的 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 函数(调试出现),字符串内容已更改但我没有看到我的图像出现。
有没有人有办法解决这个问题。
谢谢!
编辑:
经过多个有用的答案,但即使调用 属性Changed 函数也没有出现任何变化,我开始怀疑是否真的可以更改图像源的路径。
是否可以在更改路径时更新图片?
这里是修改后的代码:
public class Ressource : INotifyPropertyChanged
{
public String downloaded
{
get
{
return _downloaded;
}
set
{
_downloaded = value;
if (PropertyChanged != null)
PropertyChanged(this,new PropertyChangedEventArgs("downloaded"));
}
}
您应该更改 属性 声明,以便可以通知视图在视图模型中更改了哪些源 属性 并更新通知的 属性 值的控件。
private String _downloaded;
public String downloaded
{
get
{
return _downloaded;
}
set
{
_downloaded = value;
NotifyPropertyChanged("downloaded");
}
}
C# 视图模型源代码是
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"));
}
}
}
您只能在可访问性级别为 public
时应用数据绑定。 class 的默认可访问性级别是 internal
。您尚未应用可访问性级别,因此您的 class 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
动态获取您的程序集名称)
将 UpdateSourceTrigger=PropertyChanged 添加到您的绑定中。
好吧,这是一个菜鸟错误,但我更喜欢说明问题出在哪里,因为我找不到任何主题来解释可能是什么问题。
但是我自己发现它......我想没有人真正需要它。总之:
我还不够清楚。
在我的示例中,我将图像源绑定到资源 class.
中的下载字段
问题是资源对象包含在另一个未实现 INotifyPropertyChanged 的 class 中。
一旦我这样做了,一切正常。
感谢所有试图帮助我的人,对于菜鸟和不清楚的地方,我们深表歉意。
如果有人遇到这个问题,代码如下:
部分资源:
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"/>
我的 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 函数(调试出现),字符串内容已更改但我没有看到我的图像出现。
有没有人有办法解决这个问题。
谢谢!
编辑: 经过多个有用的答案,但即使调用 属性Changed 函数也没有出现任何变化,我开始怀疑是否真的可以更改图像源的路径。
是否可以在更改路径时更新图片?
这里是修改后的代码:
public class Ressource : INotifyPropertyChanged
{
public String downloaded
{
get
{
return _downloaded;
}
set
{
_downloaded = value;
if (PropertyChanged != null)
PropertyChanged(this,new PropertyChangedEventArgs("downloaded"));
}
}
您应该更改 属性 声明,以便可以通知视图在视图模型中更改了哪些源 属性 并更新通知的 属性 值的控件。
private String _downloaded;
public String downloaded
{
get
{
return _downloaded;
}
set
{
_downloaded = value;
NotifyPropertyChanged("downloaded");
}
}
C# 视图模型源代码是
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"));
}
}
}
您只能在可访问性级别为 public
时应用数据绑定。 class 的默认可访问性级别是 internal
。您尚未应用可访问性级别,因此您的 class 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
动态获取您的程序集名称)
将 UpdateSourceTrigger=PropertyChanged 添加到您的绑定中。
好吧,这是一个菜鸟错误,但我更喜欢说明问题出在哪里,因为我找不到任何主题来解释可能是什么问题。 但是我自己发现它......我想没有人真正需要它。总之:
我还不够清楚。 在我的示例中,我将图像源绑定到资源 class.
中的下载字段问题是资源对象包含在另一个未实现 INotifyPropertyChanged 的 class 中。
一旦我这样做了,一切正常。
感谢所有试图帮助我的人,对于菜鸟和不清楚的地方,我们深表歉意。
如果有人遇到这个问题,代码如下:
部分资源:
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"/>