2011-02-08 103 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