我無法找到實現該功能的正確事件。WPF組合框,每當綁定數據發生變化時,將SelectedIndex設置爲0?
TargetUpdated事件不起作用。
在xaml上將SelectedIndex設置爲0只會影響第一次加載數據。
我無法找到實現該功能的正確事件。WPF組合框,每當綁定數據發生變化時,將SelectedIndex設置爲0?
TargetUpdated事件不起作用。
在xaml上將SelectedIndex設置爲0只會影響第一次加載數據。
您是否嘗試過SourceUpdated事件?
您可以:
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!");
}
我面臨同樣的問題。爲了克服這個問題,我用下面的步驟:
綁定文本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;
}