2015-02-10 114 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

相關問題