我在这个大型项目上花了几个小时,所以我举了一个简单的例子。问题是,当您按下“添加”按钮时,它会将数字添加到ComboBox项源属性...很好,但是当您打开或从comboBox中选择任何项时,绑定将停止工作。 我一定很想念东西。
XAML:
....
<Grid>
<ComboBox x:Name="comboBox" HorizontalAlignment="Left" Margin="82,63,0,0"
VerticalAlignment="Top" Width="120"/>
<Button x:Name="AddButton" Content="Add" HorizontalAlignment="Left"
Margin="82,143,0,0" VerticalAlignment="Top" Width="75"
Click="NewNumberClick"/>
</Grid>
...
C#代码:
namespace ComboBoxBinding
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
private List<double> _numbers;
Binding comboBoxBinding;
public List<double> Numbers
{
get
{
return _numbers;
}
set
{
_numbers = value;
OnPropertyChanged("Numbers");
}
}
public MainWindow()
{
InitializeComponent();
Numbers = new List<double>(){ 1.0, 2.0, 3.0};
comboBoxBinding = new Binding();
comboBoxBinding.Path = new PropertyPath("Numbers");
comboBoxBinding.Mode = BindingMode.TwoWay;
BindingOperations.SetBinding(comboBox, ComboBox.ItemsSourceProperty, comboBoxBinding);
DataContext = this;
}
private void NewNumberClick(object sender, RoutedEventArgs e)
{
Random rand = new Random();
double newNumber = 2.0 - rand.NextDouble();
Numbers.Add(newNumber);
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new
PropertyChangedEventArgs(propertyName));
}
}
}
答案 0 :(得分:0)
使用ObservableCollection
代替列表。当列表中的内容发生更改时,列表不提供通知。
ObservableCollection是一个集合,它使集合外部的代码可以知道何时发生对集合的更改(添加,移动,删除)。它在WPF和Silverlight中大量使用,但不仅限于此。代码可以添加事件处理程序以查看集合何时更改,然后通过事件处理程序做出反应以进行一些其他处理。这可能是更改UI或执行其他操作。
答案 1 :(得分:0)
您的来源是List
,它不会通知UI有关成员更新的信息。您可以改用ObservableCollection
或每次执行OnPropertyChanged
.Add
更重要的是,您应该使用真实的DataContext
而不是UI
类,并且应该在xaml
中进行绑定,而不要在后面的代码中进行