Я пытаюсь представить вам решение на небольшом примере.Вы увидите, что некоторые вещи изменились.Я надеюсь, что он все еще будет соответствовать вашим потребностям:
<ListView ItemsSource="{Binding MovieLibrary}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ComboBox ItemsSource="{Binding Episodes}"
SelectedItem="{Binding Progress}" >
</ComboBox>
<TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
, и это пример модели представления:
public class MainWindowModel
{
public MainWindowModel()
{
MovieLibrary = new ObservableCollection<Media>();
//
//Exmaple Fill
//
var m1 = new Media() { Title = "Breaking Bad", Episodes = new List<string> { "1", "2", "3", "4", "5", "6" } };
var m2 = new Media() { Title = "The Big Bang Theory", Episodes = new List<string> { "1", "2", "3" } };
m1.MediaChangedAction += OnMediaChanged;
m2.MediaChangedAction += OnMediaChanged;
MovieLibrary.Add(m1);
MovieLibrary.Add(m2);
}
public ObservableCollection<Media> MovieLibrary { get; set; }
private void OnMediaChanged(Media movie)
{
// do something
}
}
public class Media
{
public event Action<Media> MediaChangedAction;
public Media()
{
}
public string Title { get; set; }
public List<string> Episodes { get; set; }
private string _progress;
public string Progress
{
get { return _progress; }
set
{
_progress = value;
MediaChangedAction?.Invoke(this);
}
}
}
Вы видите, я немного упростил это (без конвертера и т. Д.).Также «событие» перемещается в модель представления.Что касается меня, то преимущество в том, что теперь оно не будет зависеть от представления для вызова события, это важно только для модели представления.Так что, если вы создадите другой вид для отображения мультимедиа, он все равно будет работать хорошо.
Я также исключил "двусторонние" вещи, поскольку на данный момент нет необходимости отправлять данные из модели представления ввид.При необходимости для «Media» должен быть реализован INotifyPropertyChanged.