WPF ComboBox,每当绑定数据发生变化时,将SelectedIndex设置为0?

时间:2011-02-23 04:24:23

标签: wpf combobox selectedindex

我找不到合适的事件来实现功能。

TargetUpdated事件无效。

在xaml上将SelectedIndex设置为0只会影响第一次加载数据。

3 个答案:

答案 0 :(得分:3)

你可以:

  • 在绑定
  • 上设置NotifyOnTargetUpdated
  • Binding.TargetUpdated
  • 添加事件处理程序
  • 在该事件处理程序中注册ItemsSource.CollectionChanged
  • 在该事件处理程序中将所选索引设置为零

问题很可能是您没有在绑定中设置NotifyonTargetUpdated,因此第一个事件未被触发或者集合正在更新,但它是相同的集合,因此第二个事件是必要的。

以下是一个使用ListBox作为ItemsControlMessageBox作为代理的工作示例,用于执行事件触发时您想要执行的操作。

这是标记:

<Grid>
    <DockPanel>
        <Button DockPanel.Dock="Top" Content="Update Target" Click="ButtonUpdateTarget_Click"/>
        <Button DockPanel.Dock="Top" Content="Update Item" Click="ButtonUpdateItem_Click"/>
        <ListBox Name="listBox" Binding.TargetUpdated="ListBox_TargetUpdated" ItemsSource="{Binding Items, NotifyOnTargetUpdated=True}"/>
    </DockPanel>
</Grid>

这是代码隐藏的代码:

public class ViewModel : INotifyPropertyChanged
{
    ObservableCollection<string> items;
    public ObservableCollection<string> Items
    {
        get { return items; }
        set { items = value; OnPropertyChanged("Items"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

void SetDataContext()
{
    DataContext = viewModel;
    viewModel.Items = new ObservableCollection<string> { "abc", "def", "ghi" };
}

ViewModel viewModel = new ViewModel();

private void ButtonUpdateTarget_Click(object sender, RoutedEventArgs e)
{
    viewModel.Items = new ObservableCollection<string> { "xyz", "pdq" };
}

private void ButtonUpdateItem_Click(object sender, RoutedEventArgs e)
{
    viewModel.Items[0] = "xxx";
}

private void ListBox_TargetUpdated(object sender, DataTransferEventArgs e)
{
    MessageBox.Show("Target Updated!");
    (listBox.ItemsSource as INotifyCollectionChanged).CollectionChanged += new NotifyCollectionChangedEventHandler(listBox_CollectionChanged);
}

void listBox_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    MessageBox.Show("Item Updated!");
}

答案 1 :(得分:0)

您是否尝试过SourceUpdated活动?

答案 2 :(得分:0)

我遇到了同样的问题。为了解决这个问题,我使用了以下步骤:

  • 创建一个TextBox
  • 将TextBox的可见性设置为Collapsed
  • 将文字绑定到ListBox.Items.Count

    <TextBox x:Name="txtCount" TextChanged="TextBox_TextChanged" Text="{Binding ElementName=ListBox1, Path=Items.Count, Mode=OneWay}" Visibility="Collapsed" />
    
  • TextBox_TextChanged事件中,将SelectedIndex设置为0

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        int count = 0;
    
        if(int.TryParse(txtCount.Text,out count) && count>0)
            ListBox1.SelectedIndex = 0;
    
    }