Master Detail MVVM WPF无法正常工作

net*_*x01 1 c# data-binding wpf mvvm

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

我的观点:DirectoryDe​​tailView.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>
Run Code Online (Sandbox Code Playgroud)

我的型号:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我的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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,AG

Ara*_*and 9

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

在项目中添加一个名为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;
  }
Run Code Online (Sandbox Code Playgroud)

}

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

     <currentProjectNamespace:DebugConverter
        x:Key="debugConverter" />
Run Code Online (Sandbox Code Playgroud)

然后在绑定中使用它,

Binding="{Binding Path=PropertyName, Converter={StaticResource debugConverter}}"
Run Code Online (Sandbox Code Playgroud)

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