尽管使用了ObservableCollection(UWP,XAML),UI仍未更新。
尽管使用了ObservableCollection(UWP,XAML),UI仍未更新。
我对这个绑定问题非常感激能得到一些帮助。基本上,我有一个显示有关文件信息的列表视图。在列表视图项本身中,有一些文本和一个按钮。
当点击该按钮时,我想要禁用该按钮。
目前,我已经设置了一个ObservableCollection - 然而,即使按钮点击被注册了,UI并不会更新。如果我转到不同的屏幕然后返回,然后UI就会更新。所以它不是即时的。
我认为在RaisePropertyChanged()的工作方式上有一些问题。我从阅读其他SO文章中了解到,与在ListView中删除或添加一个项目相比,对象中的属性更难以被检测到。
我完全被困住了,任何帮助将不胜感激。谢谢。
Xaml:
File.cs:
public class File : ViewModelBase
{
public string Name { get; set; }
public string FileName { get; set; }
public string Path { get; set; }
public string Contents { get; set; }
private Boolean isEnabled = true;
public Boolean IsEnabled {
get { return isEnabled; }
private set {
isEnabled = value;
RaisePropertyChanged("IsChecked");
}
}
private ICommand enableCommand;
public ICommand EnableCommand
{
get
{
if(enableCommand == null)
{
enableCommand = new RelayCommand(() => {
isEnabled = false;
Name += "Disabled";
RaisePropertyChanged();
});
}
return enableCommand;
}
}
}
Viewmodel:
public class MyPageViewModel : BaseViewModel
{
private ObservableCollection
public ObservableCollection
{
get { return pages; }
set
{
pages = value;
RaisePropertyChanged();
}
}
private File selectedFile = new File();
public File SelectedFile
{
get { return selectedFile; }
set
{
Set(ref selectedFile, value);
}
}
public MyPageViewModel()
{
if (ApplicationData.FileList != null)
{
Pages = new ObservableCollection
}
else
{
Pages = new ObservableCollection
}
}
在这个问题中,出现的原因是在更改对象的属性时没有正确地通知UI进行更新。具体来说,问题是在应该通知`IsEnabled`属性变化时,错误地通知了`IsChecked`属性的变化。
解决这个问题的方法是正确地通知`IsEnabled`属性的变化。`ObservableCollection`只有在其中的对象被添加或移除时才会发出通知,而对象内部属性的变化不会被它自动通知。
以下是正确的解决方法,通过正确地通知`IsEnabled`属性的变化来更新UI:
1. 在对象的属性`IsEnabled`上添加`INotifyPropertyChanged`接口的实现,以便在属性变化时通知UI进行更新。这可以通过在类中添加以下代码来实现:
public class YourClass : INotifyPropertyChanged { private bool _isEnabled; public bool IsEnabled { get { return _isEnabled; } set { if (_isEnabled != value) { _isEnabled = value; OnPropertyChanged(nameof(IsEnabled)); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 确保在更改`IsEnabled`属性的代码中,调用`IsEnabled`属性的set方法来触发属性变化的通知。例如:
YourClass.IsEnabled = true;
3. 在XAML中,将绑定设置为`IsEnabled`属性,以使UI能够正确地响应该属性的变化。例如:
通过正确地通知`IsEnabled`属性的变化,可以确保UI正确地更新,并根据属性的值进行相应的操作。这样,即使使用`ObservableCollection`,也能正确地更新UI。