2015-02-10 113 views
2

我有一个ListView绑定到我创建的类的列表。在进行操作时,应该从列表中添加/删除项目,但我的ListView未更新,即使我使用了INotifyPropertyChanged将新项目添加到列表后,ListView未更新

如果我使用ObservableCollection,它的作品,但我需要有列表排序,ObservableCollection没有做分拣WPF4.0 :(

什么办法可以让列表绑定工作?为什么没”吨甚至虽然我用INotifyPropertyChanged它的工作

XAML:

<ListView BorderThickness="0" ItemsSource="{Binding SelectedValues, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" Padding="5"> 
        <ListView.View> 
         <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}"> 
          <GridViewColumn DisplayMemberBinding="{Binding Value}"></GridViewColumn> 

VM:

private List<CheckBoxItem> _selectedValues = new List<CheckBoxItem>(); 

    public List<CheckBoxItem> SelectedValues 
      { 
       get { return _selectedValues; } 
       set 
       { 
        _selectedValues = value; 
        OnPropertyChanged(); 
       } 
      } 

    private void UnselectValueCommandExecute(CheckBoxItem value) 
      { 
       value.IsSelected = false; 
       SelectedValues.Remove(value); 
       //OnPropertyChanged("SelectedValues"); 
       OnPropertyChanged("IsAllFilteredValuesSelected"); 
      } 

public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

CheckBoxItem类包含2个属性,ValueIsChecked,我不认为这里是相关的。

所以基本上,我有一个按钮,它使用UnselectValueCommandExecute从列表中删除项目,我应该看到在UI中更新的列表,但我不是。

当我调试时,我可以看到SelectedValues列表更新,但不是我的用户界面。

+2

把你的代码Xaml和VM! – Usama 2015-02-10 08:44:25

+0

这取决于你如何实现INotifyPropertyChanged。如果你已经像其他任何属性那样完成了它,那么当整个集合对象本身发生变化时,它将会触发,而不是在其元素被修改时触发。 – mcy 2015-02-10 08:44:53

+0

向我们展示您的c#代码与您的列表。你的XAML也会很棒。 – Tomtom 2015-02-10 08:46:29

回答

1

您的UI中需要一个CollectionViewSource

的XAML

<Window x:Class="WavTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
     xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"   
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <CollectionViewSource Source="{Binding TestSource}" x:Key="cvs"> 
      <CollectionViewSource.SortDescriptions> 
       <scm:SortDescription PropertyName="Order"/> 
      </CollectionViewSource.SortDescriptions> 
     </CollectionViewSource> 
    </Window.Resources> 
    <ListView ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="Description"/> 
</Window> 

后面的代码

namespace WavTest 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      var vm = new ViewModel(); 
      this.DataContext = vm; 

      vm.TestSource.Add(new TestItem { Description="Zero", Order=0 }); 
     } 
    } 

    public class ViewModel 
    { 
     public ObservableCollection<TestItem> TestSource { get; set; } 

     public ViewModel() 
     { 
      TestSource = new ObservableCollection<TestItem>(); 
      TestSource.Add(new TestItem { Description = "Second", Order = 2 }); 
      TestSource.Add(new TestItem { Description = "Third", Order = 3 }); 
      TestSource.Add(new TestItem { Description = "First", Order = 1 }); 
     } 
    } 

    public class TestItem 
    { 
     public int Order { get; set; } 
     public string Description { get; set; } 
    } 
} 

说明

ObservableCollection引发PropertyChanged事件如您所愿,但你不能小号ort it。 因此,您需要CollectionView对其进行排序并将排序后的集合绑定到您ListView/ListBox。 正如你所看到的,在DataContext初始化之后添加一个元素会影响正确排序最后添加项目(“Zero”)的UI。

+0

我确实尝试过,但它对我没有用,我以为我需要WPF4.5中的IsLiveSortingRequested。我会再试一次。 – 2015-02-10 09:11:46

0

您需要使用ObservableCollection,因为这会引发您的wpf ListView将采用的集合更改事件。

如何做

Public ObservableCollection<object> MyList 
{ 
    get 
    { 
     return new ObservableCollection<object>(MySortedList); 
    } 
} 

,然后当你改变你的排序列表提出一个属性更改事件MYLIST。

这显然取决于您想如何对列表进行排序,因为可能需要对ObservableCollection进行排序,您的问题需要更多信息。

+0

那么,有什么办法可以为列表引发集合更改事件吗?我猜不会? – 2015-02-10 08:51:41

+0

不。你可以有1个列表和1个observablecollection同步,但我不认为这是可行的。 – mcy 2015-02-10 08:54:04

相关问题