Master Detail MVVM WPF无法正常工作

我无法让我的绑定工作在Detail ListView上。 我已粘贴下面的所有MVVM模式代码。 请帮忙!!!

我的观点:DirectoryDe​​tailView.cs

                      

我的型号:

 public class DirectoryModel : INotifyPropertyChanged { private string _fileName; private DateTime _createdTime; public string FileName { get { return _fileName; } set { _fileName = value; RaisePropertyChanged("FileName"); } } private IEnumerable _fileDetails; public IEnumerable FileDetails { get { return _fileDetails; } set { _fileDetails = value; RaisePropertyChanged("FileDetails"); } } #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; #endregion protected void RaisePropertyChanged(string propertyName) { PropertyChangedEventHandler propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } public class FileDetails { public long Length { get; set; } public DateTime LastAccessTime { get; set; } } 

我的ViewModel:

 public class DirectoryViewModel : BaseViewModel { private IEnumerable _directoryDetails; public IEnumerable DirectoryDetails { get { var service = GetService(); _directoryDetails = service.GetDirectoryDetails(); return _directoryDetails; } set { if(_directoryDetails != value) { _directoryDetails = value; base.RaisePropertyChanged("DirectoryDetails"); } } } private DirectoryModel _selectedDirName; public DirectoryModel SelectedDirName { get { return _selectedDirName; } set { _selectedDirName = value; base.RaisePropertyChanged("SelectedDirName"); } } } 

请让我知道,我做错了什么?

谢谢,AG

很难说没有看到XAML,但我的第一个想法是1)你没有将DataContext属性设置为ViewModel或2)你在Binding本身有一些语法问题。

您应该使用ObservableCollection而不是IEnumerable 来支持DataBinding。 我也不确定您的DirectoryDe​​tails getter的实现是否有益。 你的setter直接设置私有变量并触发PropertyChanged事件 – 这是正确的。 但是你的getter也会直接设置变量,绕过PropertyChanged事件。 更不用说你有一个吸气者在做一个setter的工作,这在几个层面上可能是一个坏主意。 我认为你最好简化你的getter并让它只返回私有变量。 你真的需要每次都检索细节,还是可以使用局部变量?

我还要指出,您不需要在模型上实现INotifyPropertyChanged:ViewModel需要此接口来支持DataBinding,但将它添加到Model类没有实际价值。

我不记得我从哪里得到这种技术,但它在用于调试绑定时非常有用

在项目中添加一个名为Debugconverter的类

 public class DebugConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; //set the breakpoint here } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; } 

}

然后我在app.xaml中添加对它的引用

   

然后在绑定中使用它,

 Binding="{Binding Path=PropertyName, Converter={StaticResource debugConverter}}" 

当绑定发生时,你会得到一个断点,如果没有它,我会被搞砸。 还要检查输出窗口,那里有绑定失败的列表。

会有所帮助,知道问题是什么……从来没有,我要问的问题是: –

是你的吸气者被击中(在它们中放一个断点)?

是第一个列表视图工作,第二个不是吗?

如果它只是第二个失败我会猜测问题是你试图将两列绑定到属性IEnumerable FileDetails,然后你试图遵循IEnumerable上的属性路径,这将无法工作,如它是一组对象,而不是一个。 您是否已从上面的列表视图中复制并粘贴了代码,而未正确设置项目来源?

你跑步时输出窗口是什么? 它通常告诉您无法找到绑定路径。 如果你按照上面的调试转换器建议,你可以找出你绑定的内容(如果有的话)