Я только что столкнулся с проблемой привязки коллекции в ItemsControl к ItemTeplate, который содержит ограниченный ComboBox.
В моем сценарии мне нужно «сгенерировать» форму, которая включает текстовое поле и поле со списком для каждого элемента в коллекции, и позволить пользователю обновлять элементы. Я мог бы использовать для этого DataGrid, но я хотел бы видеть все строки в режиме редактирования, поэтому я использую ItemsControl с настраиваемым ItemTemplate.
Можно редактировать текстовые поля, но когда вы пытаетесь изменить какой-либо ComboBox, все остальные ComboBox в других строках также изменятся. Это ошибка или особенность?
Спасибо, Ондрей
Window.xaml
Window.xaml.cs
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class ViewModel
{
public ViewModel()
{
SampleItems = new List {
new SampleItem { ItemValue = "Value 1" },
new SampleItem { ItemValue = "Value 2" },
new SampleItem { ItemValue = "Value 3" }
};
AvailableItemTypes = new List {
new SampleItemType { Name = "Type 1", Value = 1 },
new SampleItemType { Name = "Type 2", Value = 2 },
new SampleItemType { Name = "Type 3", Value = 3 },
new SampleItemType { Name = "Type 4", Value = 4 }
};
}
public IList SampleItems { get; private set; }
public IList AvailableItemTypes { get; private set; }
}
public class SampleItem : ObservableObject
{
private string _itemValue;
private int _itemType;
public string ItemValue
{
get { return _itemValue; }
set { _itemValue = value; RaisePropertyChanged("ItemValue"); }
}
public int ItemType
{
get { return _itemType; }
set { _itemType = value; RaisePropertyChanged("ItemType"); }
}
}
public class SampleItemType : ObservableObject
{
private string _name;
private int _value;
public string Name
{
get { return _name; }
set { _name = value; RaisePropertyChanged("Name"); }
}
public int Value
{
get { return _value; }
set { _value = value; RaisePropertyChanged("Value"); }
}
}
public abstract class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Картинка