【发布时间】:2011-08-17 06:32:50
【问题描述】:
我有一个绑定到 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];
}
}
但是如果我像我需要的那样从设置器中进行设置,那么设置为 null 然后我想要的值不起作用。
【问题讨论】:
标签: silverlight binding combobox selection