2011-02-08 101 views
2

我的数据绑定ComboBox遇到刷新问题。 当我从代码隐藏中更改SelectedValue时,不会刷新选择内容。 这是我所做的一个例子,它说明了这个问题。难道我做错了什么 ?Silverlight数据绑定ComboBox在SelectedValue集不刷新时不会刷新

谢谢!


<navigation:Page x:Class="Views.TestCB" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      mc:Ignorable="d" 
      xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
      d:DesignWidth="640" d:DesignHeight="480" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}" 
      Title="TestCB Page"> 
    <Grid x:Name="LayoutRoot"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <ComboBox ItemsSource="{Binding AllItems, Mode=TwoWay}" Grid.Row="0" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" DisplayMemberPath="Key" SelectedValuePath="Value" SelectedValue="{Binding SelectedValue, Mode=TwoWay}"/> 
     <Button Content="Change" Click="Button_Click" Grid.Row="1" /> 
     <Button Content="Display" Click="Button_Click_1" Grid.Row="2" /> 
    </Grid> 
</navigation:Page> 

public partial class TestCB : Page, INotifyPropertyChanged 
{ 
    public TestCB() 
    { 
     InitializeComponent(); 
    } 

    private Random r = new Random(); 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private ObservableCollection<MyClass> allItemsField = new ObservableCollection<MyClass>(); 
    public ObservableCollection<MyClass> AllItems 
    { 
     get 
     { 
      return this.allItemsField; 
     } 

     set 
     { 
      if (this.allItemsField != value) 
      { 
       this.allItemsField = value; 
       this.OnPropertyChanged("AllItems"); 
      } 
     } 
    } 

    private MyClass selectedItemField = null; 
    public MyClass SelectedItem 
    { 
     get 
     { 
      return this.selectedItemField; 
     } 

     set 
     { 
      if (this.selectedItemField != value) 
      { 
       this.selectedItemField = value; 
       this.OnPropertyChanged("SelectedItem"); 
      } 
     } 
    } 

    private int selectedValueField; 
    public int SelectedValue 
    { 
     get 
     { 
      return this.selectedValueField; 
     } 

     set 
     { 
      if (this.selectedValueField != value) 
      { 
       this.selectedValueField = value; 
       this.OnPropertyChanged("SelectedValue"); 
      } 
     } 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     this.SetCombo(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     this.SetCombo(); 
     this.SelectRandom(); 
    } 

    private void SetCombo() 
    { 
     this.AllItems.Clear(); 

     int generated = 0; 
     while (generated < 10) 
     { 
      int val = r.Next(100); 
      string key = string.Format("Key #{0}", val); 

      if (!this.AllItems.Any(e => e.Key == key)) 
      { 
       this.AllItems.Add(new MyClass { Key = key, Value = val }); 
       generated++; 
      } 
     } 
    } 

    private void SelectRandom() 
    { 
     var tmp = this.AllItems[r.Next(this.AllItems.Count)]; 
     this.SelectedValue = tmp.Value; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(this.SelectedItem.Key); 
    } 
} 

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    private int valueField; 
    public int Value 
    { 
     get 
     { 
      return this.valueField; 
     } 

     set 
     { 
      if (this.valueField != value) 
      { 
       this.valueField = value; 
       this.OnPropertyChanged("Value"); 
      } 
     } 
    } 

    private string keyField = string.Empty; 
    public string Key 
    { 
     get 
     { 
      return this.keyField; 
     } 

     set 
     { 
      if (this.keyField != value) 
      { 
       this.keyField = value; 
       this.OnPropertyChanged("Key"); 
      } 
     } 
    } 
} 

编辑:请注意,在我的计划中,ComboBoxListBoxItem的一部分(ListBox也为数据绑定),所以我不能直接访问它重置绑定/强制重新加载。

回答

0

您是否尝试过设置SelectedItemSelectedValue有一些know issues

+0

对我来说这似乎不是一个解决方案。我真正的应用程序,有一个列表框,并在每个ListBoxItem是组合框。这些组合框绑定到我的代码后面的集合中,并且所选值是从列表框绑定的对象的属性。问题是绑定对象只知道一个ID(int),它是集合中对象的成员,但不是整个对象。我尝试了一个转换器,但我无法访问整个集合,因为我无法直接访问Combobox,所以我甚至无法读取它的ItemsSource ... – Shimrod 2011-02-08 09:10:29