ComboBoxのItemsSourceがObservableCollectionにリンクされた新しい(デフォルトではなく)ListCollectionViewにバインドされています。 ComboBox SelectedItemプロパティは、Public SelectedHatプロパティにバインドされています。ComboBoxのSelectedItemが実際に値の前にヌルに設定されています
手順1:コンボボックスの2番目の項目を選択します。 SelectedHatは、リストの2番目のハットになりました。 ステップ2:(ボタンをクリックします)リストの2番目のスポットを新しいハットに設定します。 SelectedHatは最初にnullに設定され、新しいハットに設定されます。
なぜ新しいハットの前にSelectedHatがnullに設定されていますか?
は、私はそれが空白
(2)のみ設定SelectedHatに行くのではなく、選択したvm.Collection [インデックス] =新しいハット()とコンボボックスは、インデックスが選択したこと場合
は (1)、続けることができるようにしたいです一度新しい帽子、NULLの代わりにして、新しい帽子
C#へ:
public partial class MainWindow : Window
{
private readonly ViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModel();
DataContext = vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Hat item = new Hat { Name = "hat 2", Color = "Red"};
vm.Collection[1] = item;
}
}
public class ViewModel : BaseNotifyPropertyChanged
{
public ObservableCollection<Hat> Collection { get; set; }
public ListCollectionView View { get; set; }
private Hat selectedHat;
public Hat SelectedHat
{
get { return selectedHat; }
set
{
selectedHat = value;
Console.WriteLine(string.Format("SelectedHat set to [{0}]", value));
NotifyPropertyChanged("SelectedHat");
}
}
public ViewModel()
{
Collection = new ObservableCollection<Hat>()
{
new Hat { Name = "hat 1", Color = "Black" },
new Hat { Name = "hat 2", Color = "Black" },
new Hat { Name = "hat 3", Color = "Black" },
};
View = new ListCollectionView(Collection);
View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
}
}
public class Hat
{
public string Name { get; set; }
public string Color { get; set; }
public override string ToString()
{
return string.Format("{0} ({1})", Name, Color);
}
}
public abstract class BaseNotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML:
<StackPanel>
<TextBlock Text="{Binding Path=SelectedHat, Mode=OneWay}" />
<ComboBox ItemsSource="{Binding Path=View}" SelectedItem="{Binding Path=SelectedHat, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="click me" Click="Button_Click" />
</StackPanel>
私の答えを見てください。項目を直接更新し、OnCollectionChangedへの呼び出しはありません。 – Paparazzi
はい、私が言ったことはあなたが提案したもの以外の回避策です:-) – Phil