好的,所以你需要减少你的努力是DataBinding
。既然你提到了你的问题中的数据绑定,我会假设你知道它。所以我会尽快解决答案。此外,由于您没有提及任何平台,因此我假定它是WPF
,但是如果需要,代码可以复制到WinRT或UWP。只是因为它是一个不同的平台,请在评论部分告诉我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>
现在,自我约束的观点,以它的代码隐藏,所以在Window声明添加
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","[email protected]"),
new MyDummyUser("User 2","[email protected]"),
new MyDummyUser("User 3","[email protected]"),
new MyDummyUser("User 4","[email protected]"),
new MyDummyUser("User 5","[email protected]"),
new MyDummyUser("User 6","[email protected]"),
};
DataFromSQLService = new ObservableCollection<MyDummyUser>(someData);
}
请注意我已经使用了WPF
的一个例子,但即使你要使用的WinRT或UWP代码它会工作,只记得切换Window.Resources
与Page.Resources
另外,UWP你可以使用x:Bind
并使用x:绑定可以帮助你摆脱RelativeResource=self
感谢您的回复。这是很多消化... 我没有忘记提及我正在使用Windows窗体。这有什么区别吗? –
好的。因为在winForms中你没有xaml。所以数据绑定必须以另一种方式完成。因此,对于应用数据绑定使用https://stackoverflow.com/q/2251075/3766231 –
我没有太多的经验与winForms,但我会尽量为你得到一个样本。 –