Я использую .Net 4.6.1 с приложением WPF.У нас есть ObservableCollection
, и мы хотим связать коллекцию со списком, который должен иметь сортировку по алфавиту и автоматически обновлять новый элемент в коллекции.
Я использую CollectionViewSource
и искал здесь в StackOverflow обновления, мне нужно использовать INotifyPropertyChanged
.Но по какой-то причине это не работает: (.
Класс объекта:
using System.Text;
using System.Threading.Tasks;
namespace ObservableCollection
{
public class AlarmTypes : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string name;
public AlarmTypes(string _name)
{
this.name = _name;
}
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged("Name");
}
}
protected void OnPropertyChanged(string prop)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(prop));
}
}
}
}
XAML-файл
<Window x:Class="ObservableCollection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ObservableCollection"
xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:clr="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.Resources>
<CollectionViewSource x:Name="CollectionViewSource" x:Key="src" Source="{Binding alarmTypes }" IsLiveFilteringRequested="True">
<CollectionViewSource.LiveSortingProperties>
<clr:String>Name</clr:String>
</CollectionViewSource.LiveSortingProperties>
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</Grid.Resources>
<ListView x:Name="lstAlarmTypes" HorizontalAlignment="Left" Height="319" Margin="585,48,0,0" VerticalAlignment="Top" Width="157" ItemsSource="{Binding Source={StaticResource src}}">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
</GridView>
</ListView.View>
</ListView>
<TextBox HorizontalAlignment="Left" Height="23" Margin="10,48,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" Name="textBox1"/>
<Button Content="Add item" HorizontalAlignment="Left" Margin="173,51,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<ListView x:Name="LstNames2" HorizontalAlignment="Left" Height="301" Margin="339,66,0,0" VerticalAlignment="Top" Width="180">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
XAML.cs
код позади:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ObservableCollection
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private ObservableCollection<AlarmTypes> alarmTypes = new ObservableCollection<AlarmTypes>();
private ObservableCollection<AlarmTypes> sortedTypes = new ObservableCollection<AlarmTypes>();
public MainWindow()
{
InitializeComponent();
LstNames2.ItemsSource = alarmTypes;
var alarmType = new AlarmTypes("inbraak");
alarmTypes.Add(alarmType);
var alarmType2 = new AlarmTypes("alarm");
//alarmType.Name = textBox1.Text;
alarmTypes.Add(alarmType2);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var alarmType = new AlarmTypes(textBox1.Text);
//alarmType.Name = textBox1.Text;
alarmTypes.Add(alarmType);
}
}
}
Я не знаю, работает ли привязка или это свойство, или мне все еще нужно что-то еще. Первый список имеет привязку только к коллекции Observable, и это работает при вводе данных из текстового поля.Но второе представление списка, в котором есть collectionViewSource, очевидно, не работает. Есть идеи, чего не хватает?