首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Master Detail MVVM WPF不工作

Master Detail MVVM WPF不工作
EN

Stack Overflow用户
提问于 2009-10-14 12:55:29
回答 3查看 2.4K关注 0票数 1

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

我的观点: DirectoryDetailView.cs

代码语言:javascript
运行
复制
<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>

我的模型:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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,但是将其添加到模型类中没有实际价值。

票数 0
EN

Stack Overflow用户

发布于 2009-10-15 02:45:32

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

将名为Debugconverter的类添加到项目中

代码语言:javascript
运行
复制
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中添加了对它的引用

代码语言:javascript
运行
复制
     <currentProjectNamespace:DebugConverter
        x:Key="debugConverter" />

然后在绑定中使用它,

代码语言:javascript
运行
复制
Binding="{Binding Path=PropertyName, Converter={StaticResource debugConverter}}"

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

票数 9
EN

Stack Overflow用户

发布于 2009-10-17 15:12:45

知道问题出在哪里会很有帮助。不过,我想问的问题是:

你的getter被击中了吗(在里面放了一个断点)?

第一个列表视图是否有效,第二个列表视图是否有效?

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

运行时,“输出”窗口中显示的是什么?它通常会告诉您无法找到绑定路径。如果你遵循上面的调试转换器建议,你可以发现你绑定的是什么(如果有的话)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1566060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档