WPF ComboBox 绑定 ItemsSource
WPF ComboBox binding ItemsSource
我是 WPF 的初学者,正在尝试将 ComboBox 的项目绑定到 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
'System.Reflection.TargetInvocationException' 类型的未处理异常发生在 PresentationFramework.dll
谁能告诉我我做错了什么?
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}"
如果你想通知 INotifyPropertyChanged
你也可以考虑使用 INotifyPropertyChanged
接口=29=] 如果 属性
有任何变化
cmbContent
为空,因为您从未将其设置为任何值。我猜错误实际上是 NullReferenceException
,但它显示为 TargetInvocationException
,因为它在视图的构造函数中。
此外,您设置了 ComboBox
的 ItemsSource
两次(一次在绑定中,一次在构造函数中)。你不需要那样做。选一个。你的绑定不会像它写的那样工作(因为 DataContext
没有设置)所以你应该在代码中进行,或者设置 DataContext
(如 Nadia 所建议的) .
您当前的实施存在一些问题。正如其他人所说,您的列表当前为 NULL
,Window 的 DataContext
未设置。
不过,我建议(尤其是因为您刚刚开始使用 WPF)学习使用 MVVM
以 'correct' 的方式进行绑定。
请参阅下面的简化示例:
首先,您要设置 Window
的 DataContext
。这将允许 XAML
到 'see' 您的 ViewModel
.
中的属性
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
接下来,简单地设置一个 ViewModel
class,它将包含所有 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>
我是 WPF 的初学者,正在尝试将 ComboBox 的项目绑定到 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
'System.Reflection.TargetInvocationException' 类型的未处理异常发生在 PresentationFramework.dll
谁能告诉我我做错了什么?
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) 设置 DataContextthis.DataContext=this;
或来自Xaml:
DataContext="{Binding RelativeSource={RelativeSource Self}}">
其次 : 在 ItemSource 中使用 Binding 就像你做的那样 ItemsSource="{Binding Path=cmbContent}"
如果你想通知 INotifyPropertyChanged
你也可以考虑使用 INotifyPropertyChanged
接口=29=] 如果 属性
cmbContent
为空,因为您从未将其设置为任何值。我猜错误实际上是 NullReferenceException
,但它显示为 TargetInvocationException
,因为它在视图的构造函数中。
此外,您设置了 ComboBox
的 ItemsSource
两次(一次在绑定中,一次在构造函数中)。你不需要那样做。选一个。你的绑定不会像它写的那样工作(因为 DataContext
没有设置)所以你应该在代码中进行,或者设置 DataContext
(如 Nadia 所建议的) .
您当前的实施存在一些问题。正如其他人所说,您的列表当前为 NULL
,Window 的 DataContext
未设置。
不过,我建议(尤其是因为您刚刚开始使用 WPF)学习使用 MVVM
以 'correct' 的方式进行绑定。
请参阅下面的简化示例:
首先,您要设置 Window
的 DataContext
。这将允许 XAML
到 'see' 您的 ViewModel
.
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
接下来,简单地设置一个 ViewModel
class,它将包含所有 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>