Я сделал пример кода, который работает так, как вы описали сейчас, см. Ниже:
MainWindow.xaml
<Window x:Class="TestWpfApplication.MainWindowView"
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"
mc:Ignorable="d"
Title="MainWindow"
Height="450"
Width="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<ListBox Grid.Row="0" Grid.Column="0" Name="CategoryListBox" ItemsSource="{Binding Path=CategoryCollection}" DisplayMemberPath="Description" />
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding ElementName=CategoryListBox, Path=SelectedItem.Code}" />
</Grid>
MainWindow.xaml.cs
using System.Windows;
namespace TestWpfApplication
{
public partial class MainWindowView : Window
{
private readonly MainWindowViewModel _mainWindowViewModel = new MainWindowViewModel();
public MainWindowView()
{
InitializeComponent();
DataContext = _mainWindowViewModel;
}
}
}
MainWindowViewModel.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Data;
namespace TestWpfApplication
{
internal class MainWindowViewModel
{
private readonly List<Category> _categories;
public MainWindowViewModel()
{
_categories = new List<Category>
{
new Category {Code = 1, Description = "Blah"},
new Category {Code = 1, Description = "Blah"},
new Category {Code = 2, Description = "Pop"},
new Category {Code = 3, Description = "No"},
new Category {Code = 3, Description = "No"},
new Category {Code = 4, Description = "Yes"}
};
HookUpCategoryEvents();
CategoryCollection = CollectionViewSource.GetDefaultView(_categories);
CategoryCollection.Filter = OnlyShowIfMoreThanOne;
}
private bool OnlyShowIfMoreThanOne(object obj)
{
Category item = obj as Category;
return _categories.Count(c => c.Code == item.Code) > 1;
}
public ICollectionView CategoryCollection { get; }
private void HookUpCategoryEvents()
{
// If you add items or remove them at any point then you need to call this method
// It removes the event so you don't get existing items being 'hooked up' double or more times
foreach (var category in _categories)
{
category.CodeChanged -= CategoryOnCodeChanged;
category.CodeChanged += CategoryOnCodeChanged;
}
}
private void CategoryOnCodeChanged(object sender, EventArgs e)
{
CategoryCollection.Refresh();
}
}
}
Category.cs
using System;
namespace TestWpfApplication
{
public class Category
{
private int _code;
private string _description;
public event EventHandler CodeChanged;
public int Code
{
get => _code;
set
{
if (_code != value)
{
_code = value;
OnCodeChanged();
}
}
}
public string Description
{
get => _description;
set => _description = value;
}
private void OnCodeChanged()
{
CodeChanged?.Invoke(this, EventArgs.Empty);
}
}
}
Это отображает простой ListBox, который настроен для показа свойства Description категориикласс и TextBox, который показывает SelectedItem.Code ListBox.В ViewModel ICollectionView имеет фильтр, примененный к нему, так что он показывает только элементы, эти коды появляются более одного раза.Событие вызывается из класса Category при установке свойства Code (из TextBox), которое MainWindowViewModel слушает и использует для вызова .Refresh () в ICollectionView.В производственном коде нет проверки или других вещей, которые вы хотели бы получить, но это должно показать вам основы того, что вы хотите.