[英]Combobox selected item binding to GridViewColumn and GridViewColumn binding to combobox selected item
[英]ComboBox ItemSourceProperty losts binding when item selected
我在這個大型項目上花了幾個小時,因此我舉了一個簡單的例子。 問題是,當您按下“添加”按鈕時,它會將數字添加到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));
}
}
}
使用ObservableCollection
而不是List。 當列表中的內容發生更改時,列表不提供通知。
ObservableCollection是一個集合,它使集合外部的代碼可以知道何時發生對集合的更改(添加,移動,刪除)。 它在WPF和Silverlight中大量使用,但不僅限於此。 代碼可以添加事件處理程序以查看集合何時更改,然后通過事件處理程序做出反應以進行一些其他處理。 這可能是更改UI或執行其他操作。
您的來源是List
,它不會通知UI有關成員更新的信息。 你可以使用ObservableCollection
代替或致電OnPropertyChanged
你做后各一次.Add
更重要的是,您應該使用真實的DataContext
而不是UI
類,並且應該在xaml
中進行綁定,而不是在后面的代碼中進行綁定
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.