WPF ComboBox, когда бы ни изменялись связанные данные, установите SelectedIndex в 0? - PullRequest
0 голосов
/ 23 февраля 2011

Я не смог найти подходящее событие для достижения функциональности.

Событие TargetUpdated не сработало.

Установка SelectedIndex на 0 в xaml повлияет только на первую загрузку данных.

Ответы [ 3 ]

3 голосов
/ 23 февраля 2011

Вы можете:

  • Набор NotifyOnTargetUpdated на переплете
  • Добавить обработчик события для Binding.TargetUpdated
  • В этом обработчике событий зарегистрируйтесь для ItemsSource.CollectionChanged
  • В этом обработчике событий установите выбранный индекс на ноль

Скорее всего, проблема заключается в том, что вы не установили NotifyonTargetUpdated в привязке, поэтому первое событие не было запущено или что коллекция обновлялась, но это была та же коллекция, поэтому второе событие необходимо.

Вот рабочий пример использования ListBox в качестве ItemsControl и MessageBox в качестве прокси-сервера для выполнения всего, что вы хотите сделать, когда происходит событие.

Вот разметка:

<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!");
}
0 голосов
/ 17 сентября 2012

Я столкнулся с той же проблемой.Чтобы преодолеть эту проблему, я использовал следующие шаги:

  • создать TextBox
  • Установите видимость TextBox на Collapsed
  • Bind Text на 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;
    
    }
    
0 голосов
/ 23 февраля 2011

Вы пробовали событие SourceUpdated ?

...