好的,所以你需要减少工作量的是DataBinding。既然您在问题中提到了数据绑定,我假设您知道这一点。因此,我将快速浏览答案。此外,由于您没有提到任何平台,我认为它是WPF,但如果您愿意,可以将代码复制到 WinRT 或 UWP。万一它是一个不同的平台,请在 cmets 部分告诉我Link to full solution In case you wana skip
您的 XAML:
我已经使用基本绑定到代码隐藏来避免示例中的大量类。下面是代码:
<StackPanel Margin="20">
<ComboBox x:Name="UserCombobox"
Height="20"
Width="300"
ItemsSource="{Binding DataFromSQLService,Mode=OneWay}"
SelectedItem="{Binding CurrentSelectedUser,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ItemTemplate="{StaticResource UserDataTemplate}"
SelectionChanged="UserCombobox_SelectionChanged"/>
<Button Content="Clear Combo" Height="30" Width="100" Margin="10" Click="ClearData"/>
<Button Content="Load Combo" Height="30" Width="100" Margin="10" Click="LoadData"/>
<TextBlock Text="{Binding CurrentSelectedUser.Name,Mode=OneWay}" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding CurrentSelectedUser.Email,Mode=OneWay}" HorizontalAlignment="Center"/>
</StackPanel>
现在,您的Window.Resources 将您的dataTemplate 放在您的组合框项目中。
<Window.Resources>
<DataTemplate x:Key="UserDataTemplate">
<StackPanel>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
现在,将视图自我绑定到它的代码隐藏,所以在窗口声明中添加
DataContext = "{Binding RelativeSource={RelativeSource Self}}"
现在视图已经准备就绪,让我们快速准备好后面的代码。
一个虚拟用户类,您可以将其替换为您的模型类。
public class MyDummyUser
{
public MyDummyUser(string name, string email)
{
Name = name;
Email = email;
}
public string Name { get; set; }
public string Email { get; set; }
}
现在创建一个快速属性来保存您当前选择的用户。
private MyDummyUser currentSelectedUser;
public MyDummyUser CurrentSelectedUser
{
get { return currentSelectedUser; }
set { currentSelectedUser = value; RaisePropertyChanged(nameof(CurrentSelectedUser)); }
}
现在创建一个可观察的集合来保存来自 SQL 服务的数据:
private ObservableCollection<MyDummyUser> dataFromSQLService;
public ObservableCollection<MyDummyUser> DataFromSQLService
{
get { return dataFromSQLService; }
set { dataFromSQLService = value; RaisePropertyChanged(nameof(DataFromSQLService)); }
}
现在实现INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
//if using c# 6.0 or later replace the above with
//public void RaisePropertyChanged(string propertyName)=>
// PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
现在为combobox.SelectionChanged 事件添加一个侦听器,以便您知道所选用户何时更改:
private void UserCombobox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (CurrentSelectedUser != null && !string.IsNullOrEmpty(CurrentSelectedUser?.Email?.Trim()))
{
//perform what you wana do with the email.
}
}
创建两个方法:LoadData 和 ClearData。
private void ClearData(object sender, RoutedEventArgs e)
{
DataFromSQLService = null;
}
private void LoadData(object sender, RoutedEventArgs e)
{
List<MyDummyUser> someData = new List<MyDummyUser>()
{
new MyDummyUser("User 1","User1@gmail.com"),
new MyDummyUser("User 2","User2@gmail.com"),
new MyDummyUser("User 3","User3@gmail.com"),
new MyDummyUser("User 4","User4@gmail.com"),
new MyDummyUser("User 5","User5@gmail.com"),
new MyDummyUser("User 6","User6@gmail.com"),
};
DataFromSQLService = new ObservableCollection<MyDummyUser>(someData);
}
请注意我使用了WPF 的示例,但即使您想使用 WinRT 或 UWP 的代码,它也可以使用,只需记住将 Window.Resources 切换为 @ 987654340@ 同样,在 UWP 中你可以使用 x:Bind 并且使用 x:Bind 可以帮助你摆脱 RelativeResource=self