Я думаю, вы должны попытаться использовать MVVM framework.
Поскольку связывание основано на уведомлении, а не на активном, в случае не-MVVM-среды, если непосредственно изменить DataContext. Свойство all has bound не будет знать, что DataContext обновлен, поэтому их значение не изменится.
При использовании инфраструктуры MVVM использование ViewModel, реализующего интерфейс INotifyPropertyChanged, будет уведомлять все связанные свойства привязки при изменении свойства, избегая проблемы обновления DataContext.
Простой пример:
//C# Code
//Define a ViewModel
public class VM : INotifyPropertyChanged
{
private DataSet _ds;
public event PropertyChangedEventHandler PropertyChanged;
public DataSet Ds
{
get => _ds;
set
{
_ds = value;
//Notify: Property "Ds" updated
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Ds"));
}
}
}
public MainWindow()
{
DataContext = new VM();
//set viewmodel to DataContext before InitializeComponent
InitializeComponent();
loadUserCB();
}
<!--Xaml Code-->
<!-- V Note here.*-->
<ComboBox ItemsSource="{Binding Tables[TUserDS]}"
x:Name="UserCB"
SelectionChanged="UserCB_SelectionChanged"
Width="200"
HorizontalAlignment="left"
SelectedIndex="0"
Padding="2"
Margin="0 10 0 0">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding UserName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
*: DataSet не поддерживает индексатор, но индексатор «DataSet.Tables» поддерживает.
Из-за того, что ComboBox.ItemsSource получил уведомление об изменении свойства VM.Ds, поэтому он попытается обновить свои собственные данные