ItemsControl, который содержит связанный ComboBox в ItemTemplate

Я только что столкнулся с проблемой привязки коллекции в 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));
    }
}

Картинка

здесь вы можете увидеть результат на картинке

5
задан H.B. 24 January 2012 в 13:54
поделиться