我无法让我的绑定在Detail ListView上工作。我已经在下面粘贴了我所有的MVVM模式代码。请帮帮我!
我的观点: DirectoryDetailView.cs
<UserControl x:Class="S2.Views.DirectoryDetailView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView Grid.Column="0" ItemsSource="{Binding Path = DirectoryDetails}"
IsSynchronizedWithCurrentItem="True"
SelectedItem="{Binding SelectedDirName, Mode=TwoWay}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path = FileName}"
Header="File Name"/>
</GridView>
</ListView.View>
</ListView>
<ListView Grid.Column="1" Margin="10,0,0,0" ItemsSource="{Binding Path = DirectoryDetails}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path = FileDetails.Length}"
Header="Length"/>
<GridViewColumn DisplayMemberBinding="{Binding Path = FileDetails.LastAccessTime}"
Header="LastAccessTime"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
我的模型:
public class DirectoryModel : INotifyPropertyChanged
{
private string _fileName;
private DateTime _createdTime;
public string FileName
{
get
{
return _fileName;
}
set
{
_fileName = value;
RaisePropertyChanged("FileName");
}
}
private IEnumerable<FileDetails> _fileDetails;
public IEnumerable<FileDetails> 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<DirectoryModel> _directoryDetails;
public IEnumerable<DirectoryModel> DirectoryDetails
{
get
{
var service = GetService<IDirectoryService>();
_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
发布于 2009-10-14 19:41:04
很难说不看过XAML,但我的第一个想法是1)您没有将DataContext属性设置为ViewModel,或者2)您在绑定本身中有一些语法问题。
您应该使用ObservableCollection而不是IEnumerable来支持DataBinding。我也不确定DirectoryDetails getter的实现是否有益。您的设置器直接设置私有变量并触发PropertyChanged事件-这是正确的。但是,您的getter方法也可以绕过PropertyChanged事件直接设置变量。更不用说你有一个getter来做setter的工作,这在某些层面上可能是个坏主意。我认为你最好简化你的getter,让它只返回私有变量。你真的需要每次都检索细节吗?或者你可以使用局部变量吗?
我还想指出的是,您不需要在模型上实现INotifyPropertyChanged : ViewModel需要此接口来支持DataBinding,但是将其添加到模型类中没有实际价值。
发布于 2009-10-15 02:45:32
我不记得我是从哪里学到这项技术的,但它在用于调试绑定时非常有用。
将名为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中添加了对它的引用
<currentProjectNamespace:DebugConverter
x:Key="debugConverter" />然后在绑定中使用它,
Binding="{Binding Path=PropertyName, Converter={StaticResource debugConverter}}"当绑定发生时,你会得到一个断点命中,如果没有它,我就完蛋了。还要检查输出窗口,那里有绑定失败的列表。
发布于 2009-10-17 15:12:45
知道问题出在哪里会很有帮助。不过,我想问的问题是:
你的getter被击中了吗(在里面放了一个断点)?
第一个列表视图是否有效,第二个列表视图是否有效?
如果这只是第二个失败,我猜问题是您试图将两个列绑定到属性IEnumerable FileDetails,然后您试图遵循IEnumerable上的属性路径,这将不起作用,因为它是一组对象,而不是一个。您是否从上面的列表视图中复制并粘贴了代码,但没有正确设置项目源?
运行时,“输出”窗口中显示的是什么?它通常会告诉您无法找到绑定路径。如果你遵循上面的调试转换器建议,你可以发现你绑定的是什么(如果有的话)
https://stackoverflow.com/questions/1566060
复制相似问题