3 回答
TA贡献1836条经验 获得超13个赞
在窗口内,您可以看到InitializeComponent方法。它创建XAML中定义的所有内容,并应用所有绑定。在使用空收集器(已使用默认属性值创建)应用绑定之后,绑定将不知道该属性的任何更改,这是正确的答案。
但是实现INotifyPropertyChanged的目的更多是关于视图模型实例,而不是视觉对象。
我真的建议您如果要绑定,请对窗口和控件使用依赖项属性。这有一些原因:
依赖项属性设置器具有内置的通知机制。
如果将一个DP绑定到另一DP,则它们之间将共享值。
毕竟是WPF方法=)
这是更改后您的窗口的外观
public partial class UsbFileSelector : Window
{
public static readonly DependencyProperty UsbFilesProperty =
DependencyProperty.Register("UsbFiles", typeof(ObservableCollection<UsbFile>), typeof(UsbFileSelector));
public ObservableCollection<UsbFile> UsbFiles
{
get { return (ObservableCollection<UsbFile>) GetValue(UsbFilesProperty); }
set { SetValue(UsbFilesProperty, value); }
}
public UsbFileSelector()
{
InitializeComponent();
}
}
另外,我强烈建议您在开发WPF时使用某些WPF检查器工具,例如snoop。您可以在应用程序运行时浏览控件和属性,并可以从代码或stackoverflow =)中快速找到问题
TA贡献1806条经验 获得超5个赞
在
var usbFileSelector = new UsbFileSelector()
{
Owner = this,
UsbFiles = NewUsbFiles
};
您正在为该UsbFiles属性分配新值,而不触发该属性的属性更改通知。
您可以实现INotifyPropertyChanged并触发PropertyChanged事件,也可以使UsbFiles成为依赖项属性。
或者您NewUsbFiles在调用InitializeComponent之前将其作为构造函数参数传递并分配给它
public UsbFileSelector(ObservableCollection<UsbFile> usbFiles)
{
UsbFiles = usbFiles;
InitializeComponent();
}
并这样称呼它:
var usbFileSelector = new UsbFileSelector(NewUsbFiles)
{
Owner = this
};
请注意,如果您始终传递新的集合,则实际上不需要使用ObservableCollection。您永远不会在集合中添加元素或从集合中删除元素,因此不需要更改通知。
- 3 回答
- 0 关注
- 119 浏览
添加回答
举报