好的,所以你需要減少你的努力是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,但我會盡量爲你得到一個樣本。 –