主详细MVVM WPF不工作(Master Detail MVVM WPF not working)

2019-08-18 01:45发布

我不能让我的绑定的详细的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>

我的模型:

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; }
}

我的视图模型:

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

Answer 1:

硬盘没有看到XAML说,但我的第一个想法是:1)你没有设置DataContext属性到视图模型或2)您在绑定本身的一些语法问题。

您应该使用的ObservableCollection的IEnumerable <DirectoryModel>来支持数据绑定。 我也不清楚自己DirectoryDe​​tails吸气的实施是有利的。 您的二传手直接设置私有变量并触发PropertyChanged事件 - 这是正确的。 但是,你的getter也可以直接设置变量,绕过PropertyChanged事件。 更何况,你有一个getter做一个二传手,这可能是在几个层次上是一个坏主意的工作。 我想你会更好,简化您的getter和拥有它只是返回私有变量。 你真的需要检索格兰细节,每次也可以使用局部变量?

我还要指出的是,你并不需要实现你的模型INotifyPropertyChanged的:视图模型需要这个接口来支持数据绑定,但在将其添加到Model类没有实际价值。



Answer 2:

我不记得在那里我从得到这个技术,但它的真正有用的用于调试时绑定

添加一个类叫做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}}"

当绑定发生你得到一个断点命中,我想没有它被拧紧。 同时检查输出窗口,有一个有约束力的失败ALIST。



Answer 3:

将是有益的知道是什么问题...从来没有少,我要问的问题是: -

在您的干将被击中(把断点他们)?

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

如果它仅仅是失败我猜想,问题是,你正在尝试两列绑定到财产的IEnumerable FileDetails,然后你试图遵循一个IEnumerable的属性路径,这是行不通的,因为第二它是一组对象,而不是一个。 有你复制并从上面的列表视图粘贴代码,并设置不正确的项目源?

什么是你的输出窗口,当你运行? 它通常会告诉你,一个绑定路径找不到。 如果你按照上面的调试器的建议,你可以找到你所绑定到(如果有的话)



文章来源: Master Detail MVVM WPF not working