ObservableCollection <t>不更新GUI

时间:2016-05-02 19:58:29

标签: c# wpf user-interface data-binding observablecollection

我真的不知道如何让这个工作。我有一个带有“BackupItems”的ObservableCollection。此集合显示在ListView中。当我添加/删除或更改“BackupItems”时,用户界面不会更新!你能帮我吗?我是否设置了Binding错误? :(

这是我的代码:(缩写为相关内容)

BackupWindow XAML:

   <ListView ItemsSource="{Binding Path=BackupItems}" SelectedItem="{Binding Path=SelectedBackupItem}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Name}"></TextBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Location">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition></ColumnDefinition>
                                    <ColumnDefinition></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <TextBox Grid.Column="0" Text="{Binding Path=Location"} />
                                <Button Grid.Column="1" Content="Browse..." Click="BrowseButton_Click"></Button>
                            </Grid>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Date of last Backup" DisplayMemberBinding="{Binding Path=LastBackup}" />
                <GridViewColumn Header="Date Created" DisplayMemberBinding="{Binding Path=Created}" />
                <GridViewColumn Header="Date Modified" DisplayMemberBinding="{Binding Path=Modified}" />
            </GridView>
        </ListView.View>
    </ListView>

代码背后:

public partial class BackupWindow : Window
{
    public BackupWindow()
    {
        InitializeComponent();

        BackupViewModel backupViewModel = new BackupViewModel();
        DataContext = backupViewModel;
    }

    private void CreateBackupItemButton_Click(object sender, RoutedEventArgs e)
    {
        BackupViewModel backupViewModel = (BackupViewModel)DataContext;

        BackupItem newBackupItem = new BackupItem();
        newBackupItem.Created = DateTime.Now;
        newBackupItem.Modified = DateTime.Now;
        newBackupItem.Name = "";
        newBackupItem.Location = "";

        backupViewModel.BackupItems.Add(newBackupItem);
    }

    private void DeleteBackupItemButton_Click(object sender, RoutedEventArgs e)
    {
        BackupViewModel backupViewModel = (BackupViewModel)DataContext;
        backupViewModel.BackupItems.Remove(backupViewModel.SelectedBackupItem);
    }

    private void BrowseButton_Click(object sender, RoutedEventArgs e)
    {
        UIElement browseButton = (UIElement)sender;
        DependencyObject grid = VisualTreeHelper.GetParent(browseButton);
        DependencyObject currentbackupItem = VisualTreeHelper.GetParent(grid);

        System.Windows.Controls.ContentPresenter a = (System.Windows.Controls.ContentPresenter)currentbackupItem;
        BackupItem currentBackupItem = (BackupItem)a.Content;

        BackupViewModel backupViewModel = (BackupViewModel)DataContext;

        // The VistaFolderBrowserDialog is from "Ooki.Dialogs"
        VistaFolderBrowserDialog folderBrowserDialog = new VistaFolderBrowserDialog();
        bool? result = folderBrowserDialog.ShowDialog();
        if (result == true) // If the user presses Open in the dialog
        {
            // Find the currentBackupItem in the List
            for (int i = 0; i < backupViewModel.BackupItems.Count; i++)
            {
                if (currentBackupItem == backupViewModel.BackupItems[i])
                {
                    backupViewModel.BackupItems[i].Location = folderBrowserDialog.SelectedPath;
                    backupViewModel.BackupItems[i].Modified = DateTime.Now;
                    break;
                }
            }
        }
    }
}

视图模型

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

BackupViewModel:

public class BackupViewModel : ViewModel
{
    public ObservableCollection<BackupItem> BackupItems
    {
        get
        {
            return BackupItemLibrary.GetInstance().BackupItems;
        }
    }
}

BackupItemLibrary

public class BackupItemLibrary
{
    private static BackupItemLibrary instance;

    public static BackupItemLibrary GetInstance()
    {
        if (instance == null)
        {
            instance = new BackupItemLibrary();
        }

        return instance;
    }

    public static void SetInstance(BackupItemLibrary newBackupItemLibrary)
    {
        instance = newBackupItemLibrary;
    }

    private BackupItemLibrary()
    {

    }

    public string FileName { get; set; }

    private ObservableCollection<BackupItem> backupItems = new ObservableCollection<BackupItem>();

    public ObservableCollection<BackupItem> BackupItems
    {
        get
        {
            return backupItems;
        }
        set
        {
            backupItems = value;
        }
    }

BackupItem:

public class BackupItem
{
    public string Name { get; set; }

    public string Location { get; set; }

    public DateTime LastBackup { get; set; }

    public DateTime Created { get; set; }

    public DateTime Modified { get; set; }
}

问题的解决方案: BackupItem类必须实现INotifyPropertyChanged(例如,也可以从ViewModel派生),并在设置属性值时触发PropertyChanged事件(至少在设置Location或Modified属性时)。

代码:

    public class BackupItem : INotifyPropertyChanged
{
    private string name;

    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    private string location;

    public string Location
    {
        get
        {
            return location;
        }
        set
        {
            location = value;
            OnPropertyChanged("Location");
        }
    }

    private DateTime lastBackup;

    public DateTime LastBackup
    {
        get
        {
            return lastBackup;
        }
        set
        {
            lastBackup = value;
            OnPropertyChanged("LastBackup");
        }
    }

    private DateTime created;

    public DateTime Created
    {
        get
        {
            return created;
        }
        set
        {
            created = value;
            OnPropertyChanged("Created");
        }
    }

    private DateTime modified;

    public DateTime Modified
    {
        get
        {
            return modified;
        }
        set
        {
            modified = value;
            OnPropertyChanged("Modified");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

0 个答案:

没有答案