Използвам ObservableCollection
с два ICollectionView
за различни филтри.
Единият е за филтриране на съобщения по някакъв тип, а другият е за преброяване на проверените съобщения. Както можете да видите, филтърът за съобщения и броят на съобщенията работят добре, но когато премахвам отметката, съобщението изчезва от списъка (броят все още работи).
Между другото съжалявам за дългия пост, исках да включа всички подходящи неща.
XAML кодът:
<!-- Messages List -->
<DockPanel Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
Height="500">
<ListBox Name="listBoxZone"
ItemsSource="{Binding filteredMessageList}"
Background="Transparent"
BorderThickness="0">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Name="CheckBoxZone"
Content="{Binding text}"
Tag="{Binding id}"
Unchecked="CheckBoxZone_Unchecked"
Foreground="WhiteSmoke"
Margin="0,5,0,0"
IsChecked="{Binding isChecked}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
<Button Content="Test Add New"
Grid.Column="2"
Height="25"
HorizontalAlignment="Left"
Margin="34,2,0,0"
Click="button1_Click" />
<Label Content="{Binding checkedMessageList.Count}"
Grid.Column="2"
Height="25"
Margin="147,2,373,0"
Width="20"
Foreground="white" />
Екранна снимка:
Код:
/* ViewModel Class */
public class MainViewModel : INotifyPropertyChanged
{
// Constructor
public MainViewModel()
{
#region filteredMessageList
// connect the ObservableCollection to CollectionView
_filteredMessageList = CollectionViewSource.GetDefaultView(messageList);
// set filter
_filteredMessageList.Filter = delegate(object item)
{
MessageClass temp = item as MessageClass;
if ( selectedFilter.Equals(AvailableFilters.All) )
{
return true;
}
else
{
return temp.filter.Equals(_selectedFilter);
}
};
#endregion
#region checkedMessageList
// connect the ObservableCollection to CollectionView
_checkedMessageList = CollectionViewSource.GetDefaultView(messageList);
// set filter
_checkedMessageList.Filter = delegate(object item) { return (item as MessageClass).isChecked; };
#endregion
}
// message List
private ObservableCollection<MessageClass> _messageList =
new ObservableCollection<MessageClass>();
public ObservableCollection<MessageClass> messageList
{
get { return _messageList; }
set { _messageList = value; }
}
// CollectionView (filtered messageList)
private ICollectionView _filteredMessageList;
public ICollectionView filteredMessageList
{
get { return _filteredMessageList; }
}
// CollectionView (filtered messageList)
private ICollectionView _checkedMessageList;
public ICollectionView checkedMessageList
{
get { return _checkedMessageList; }
}
// SelectedFilter property
private AvailableFilters _selectedFilter = AvailableFilters.All; // Default is set to all
public AvailableFilters selectedFilter
{
get { return _selectedFilter; }
set
{
_selectedFilter = value;
RaisePropertyChanged("selectedFilter");
_filteredMessageList.Refresh(); // refresh list upon update
}
}
// FilterList (Convert Enum To Collection)
private List<KeyValuePair<string, AvailableFilters>> _AvailableFiltersList;
public List<KeyValuePair<string, AvailableFilters>> AvailableFiltersList
{
get
{
/* Check if such list available, if not create for first use */
if (_AvailableFiltersList == null)
{
_AvailableFiltersList = new List<KeyValuePair<string, AvailableFilters>>();
foreach (AvailableFilters filter in Enum.GetValues(typeof(AvailableFilters)))
{
string Description;
FieldInfo fieldInfo = filter.GetType().GetField(filter.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
/* if not null get description */
if (attributes != null && attributes.Length > 0)
{
Description = attributes[0].Description;
}
else
{
Description = string.Empty;
}
/* add as new item to filterList */
KeyValuePair<string, AvailableFilters> TypeKeyValue =
new KeyValuePair<string, AvailableFilters>(Description, filter);
_AvailableFiltersList.Add(TypeKeyValue);
}
}
return _AvailableFiltersList;
}
}
#region Implement INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
Код за функция за премахване на отметка
private void CheckBoxZone_Unchecked(object sender, RoutedEventArgs e)
{
CheckBox chkZone = (CheckBox)sender;
ucSystemMessageVM.checkedMessageList.Refresh();
}
MessageClass
иAvailableFilters
не е включена и има редица функции на C#/.NET, които биха направили този код много по-кондензиран и по-лесен за разбиране с един поглед -- автоматични свойства, ламбда изрази, LINQ. - person Zev Spitz   schedule 06.05.2018