У меня есть список элементов, связанных с ComboBox. Когда пользователь выбирает элемент, я бы хотел отменить выбор и выбрать другой элемент. Это должно происходить из установщика свойства, к которому привязан SelectedItem. Я использую Silverlight 3.
Моя модель данных для каждого элемента в ComboBox:
public class DataItem
{
public int Id { get; set; }
public string Name { get; set; }
}
Объект, для которого задан DataContext:
public class DataContainer : INotifyPropertyChanged
{
public DataContainer()
{
itemList = new List<DataItem>();
itemList.Add(new DataItem() { Id = 1, Name = "First" });
itemList.Add(new DataItem() { Id = 2, Name = "Second" });
itemList.Add(new DataItem() { Id = 3, Name = "Third" });
}
public event PropertyChangedEventHandler PropertyChanged;
private DataItem selectedItem;
public DataItem SelectedItem
{
get { return selectedItem; }
set
{
if (value != null && value.Id == 2)
value = itemList[0];
selectedItem = value;
NotifyPropertyChanged("SelectedItem");
}
}
private List<DataItem> itemList;
public List<DataItem> ItemList
{
get { return itemList; }
set { itemList = value; NotifyPropertyChanged("DataList"); }
}
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
Соответствующие биты xaml:
<StackPanel>
<StackPanel Orientation="Horizontal">
<ComboBox x:Name="comboBox" DisplayMemberPath="Name" Width="100" ItemsSource="{Binding ItemList}" SelectedItem="{Binding Path=SelectedItem, Mode=TwoWay}"/>
<Button Content="Set to First" Width="100" Click="Button_Click"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Selected item: "/>
<TextBlock Text="{Binding SelectedItem.Id}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding SelectedItem.Name}"/>
</StackPanel>
</StackPanel>
Похоже, мой код для выбора первого элемента, когда пользователь выбирает второй элемент, работает. Выбранный элемент фактически установлен на «Первый», в то время как ComboBox все еще отображает «Второй», как если бы он был выбран.
Есть ли способ заставить ComboBox перерисовать или пересмотреть то, что он должен визуально пометить как выбранный?
Я делаю это из вышеупомянутого метода Button_Click, и он работает:
private void Button_Click(object sender, RoutedEventArgs e)
{
var c = DataContext as DataContainer;
if (c != null)
{
c.SelectedItem = null;
c.SelectedItem = c.ItemList[0];
}
}
Но если установить нулевое значение, а затем желаемое значение, не сработает, если я сделаю это из установщика так, как мне нужно.