Silverlight SelectedIndex没有正确地进行数据绑定

时间:2011-09-09 17:52:58

标签: silverlight data-binding silverlight-4.0 mvvm combobox

我有我想做的独特行为。

我有一个组合框,可以数据绑定到viewmodel项列表。第一项是“[选择项目]”。预期的行为是,当用户选择一个项目时,我会做一些事情,然后将索引重置回第一个项目。

这是有效的,除了如果你想连续2次选择第3项。这是代码: ItemViewModel:

// NOTE, I have all the INotify goo actually implemented, this is the shorthand
// without goo to make it more readable.
public class ItemViewModel : INotifyPropertyChanged
{
  public string Caption { get; set; }
  public string Test { get; set; }
}

ViewModel :(我的所有属性都在适当的位置调用OnPropertyChanged)

public class ViewModel : INotifyPropertyChanged
{
  public ObservableCollection<ItemViewModel> ChildItems { get; set; }
  public int SelectedChildIndex { get; set; }
  public string DebugOutText { get; set; }

  public ViewModel()
  {
    ChildItems = new ObservableCollection<ItemViewModel>();
    SelectedChildIndex = -1;
    DebugOutText = string.Empty;
  }
  public void LoadChildItems()
  {
    ChildItems.Add(new ItemViewModel { Caption = "[ Select Item ]" });
    ChildItems.Add(new ItemViewModel { Caption = "One", Test = "Item 1" });
    ChildItems.Add(new ItemViewModel { Caption = "Two", Test = "Item 2" });
    ChildItems.Add(new ItemViewModel { Caption = "Three", Test = "Item 3" });
    SelectedChildIndex = 0;
  }
  private void OnPropertyChanged(string propName)
  {
    if (propName == "SelectedChildIndex") { this.OnSelectedChildIndexChanged(); }
    if (this.PropertyChanged != null)
    { this.PropertyChanged(this, new PropertyChangedEventArgs(propName)); }
  }
  public void OnSelectedChildIndexChanged()
  {
    if (SelectedChildIndex <= 0) return;
    DebugOutText += "\r\n" + ChildItems[SelectedChildIndex].Test;
    SelectedChildIndex = 0; // <- BIG ISSUE HERE
  }
}

现在我的xaml:

<StackPanel HorizontalAlignment="Left">
  <ComboBox Width="200" x:Name="combo"
            ItemsSource="{Binding Path=ChildItems}"
            SelectedIndex="{Binding Path=SelectedChildIndex, Mode=TwoWay}"
            DisplayMemberPath="Caption" />
  <TextBlock Text="{Binding Path=DebugOutText}"/>
</StackPanel>

最后我的App Startup:

var vm = new ViewModel();
vm.LoadChildItems();
this.RootVisual = new MainPage { DataContext = vm };

回购步骤是:

  • 运行它
  • 选择组合,然后单击/选择“两个”。
  • 现在,点击组合。视觉样式将显示“两个”突出显示(“[选择项目]”应突出显示)。如果单击/选择“两个”,则不会发生任何事情。

我已经去了一些跟踪代码,组合的SelectedIndex是0,ViewModel.SelectedChildIndex是0,但是组合的SelectionChanged不会触发,除非我选择别的东西。

我不确定如何让它发挥作用。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

我不得不承认我对你想要的行为的可用性表示怀疑。尽管如此,如果您必须为此目的使用组合框,请尝试替换

    SelectedChildIndex = 0;

    Deployment.Current.Dispatcher.BeginInvoke(() => SelectedChildIndex = 0);

答案 1 :(得分:0)

在这里疯狂猜测。 :)

// NOTE, I have all the INotify goo actually implemented, this is the shorthand 
// without goo to make it more readable.

您没有显示INotifyPropertyChanged的实现。大多数实现都是这样的:

public int SelectedChildIndex 
{
    get
    {
        return _selectedChildIndex;
    }
    set
    {
        if (value == _selectedChildIndex) return;
        _selectedChildIndex= value;
        OnProperyChanged("SelectedChildIndex ");
    }
}

如果属性值没有改变,则会将通知短路。如果您的代码如下所示,请取出“if”语句并查看是否可以修复它。