[英]WPF ComboBox binding ItemsSource
我是WPF的初學者,並試圖將ComboBox的Items綁定到ObservableCollection
我用過這段代碼:
XAML
<Window x:Class="comboBinding2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ComboBox x:Name="cmbTest" ItemsSource="{Binding Path=cmbContent}" Width="200" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</Window>
C#
public MainWindow()
{
cmbTest.ItemsSource = cmbContent;
cmbContent.Add("test 1");
cmbContent.Add("test 2");
InitializeComponent();
}
public ObservableCollection<string> cmbContent { get; set; }
在我嘗試調試之前,我沒有在此代碼上出現任何錯誤,它會拋出錯誤:
TargetInvocationError
PresentationFramework.dll中出現未處理的“System.Reflection.TargetInvocationException”類型異常
誰能告訴我我做錯了什么?
您當前的實施有一些問題。 正如其他人所說,您的列表當前為NULL
,並且未設置Window的DataContext
。
雖然,我建議(特別是因為你剛剛開始使用WPF)學習使用MVVM
以更“正確”的方式進行綁定。
請參閱下面的簡化示例:
首先,您要設置Window
的DataContext
。 這將允許XAML
“查看” ViewModel
的屬性。
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
接下來,只需設置一個ViewModel
類,它將包含所有Window's
綁定元素,例如:
public class ViewModel
{
public ObservableCollection<string> CmbContent { get; private set; }
public ViewModel()
{
CmbContent = new ObservableCollection<string>
{
"test 1",
"test 2"
};
}
}
最后,更新您的XAML
以便綁定路徑與集合匹配:
<Grid>
<ComboBox Width="200"
VerticalAlignment="Center"
HorizontalAlignment="Center"
x:Name="cmbTest"
ItemsSource="{Binding CmbContent}" />
</Grid>
public MainWindow()
{
InitializeComponent();
cmbContent=new ObservableCollection<string>();
cmbContent.Add("test 1");
cmbContent.Add("test 2");
cmbTest.ItemsSource = cmbContent;
}
public ObservableCollection<string> cmbContent { get; set; }
上面的代碼不使用任何綁定,這意味着使用它不需要綁定Combobox's
ItemSource
,如果你不想使用綁定你需要
第一步 :使用以下命令從CodeBehind(ViewModel)設置DataContext:
this.DataContext=this;
或者來自Xaml:
DataContext="{Binding RelativeSource={RelativeSource Self}}">
第二 :在ItemSource中使用Binding就像你使用ItemsSource="{Binding Path=cmbContent}"
,如果你想在屬性發生任何變化時通知UI,你也可以考慮使用INotifyPropertyChanged
接口。
cmbContent
為null,因為您從未將其設置為任何內容。 我猜這個錯誤實際上是一個NullReferenceException
,但是它顯示為TargetInvocationException
因為它位於視圖的構造函數中。
此外,您將兩次設置ComboBox
的ItemsSource
(一次在綁定中,一次在構造函數中)。 你不需要這樣做。 選一個。 您的綁定將無法DataContext
編寫方式工作(因為未設置DataContext
),因此您應該在代碼中執行此操作,或者設置DataContext
(如Nadia所建議的那樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.