MVVMを遵守しながらObservableCollectionから項目を削除したいとします。私はこの作業を理解していますが、ロジックをかなりよく理解して実装していると思いますが、アイテムはビュー内で決して削除されません。MVVMを使用してObservableCollectionからselectedItemを削除します。
私はブレークポイントでアプリケーションをトレースしており、selectedProjectの値が正しく読み取られています。また、remove文の前後でCollectionのサイズをチェックする変数を追加しました。これは同じ値であったため、項目を削除しません。私の質問はなぜですか?私は何を逃したのですか?私が遵守していないルールは何ですか? .NETを使い慣れていない
**私はCodeFirst DBからプロジェクトのObservableCollectionを返すためにWCFサービスを使用しています。これは、ユーザーがプロジェクトビューを開くとすぐに呼び出されます。
ビュー
<ListBox ItemsSource="{Binding ProjectList, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedProject}" SelectedIndex="{Binding ProjectIndex}" BorderThickness="0" Margin="60,195,218.8,212.4">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ProjectName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Command="{Binding DeleteCommand}" Content="Up" HorizontalAlignment="Left" Margin="563,195,0,0" VerticalAlignment="Top" Height="35" Width="75"/>
のViewModel
private ObservableCollection<Project> _projectList;
public ObservableCollection<Project> ProjectList
{
get
{
var q = client.ReturnProjects().ToList();
_projectList = new ObservableCollection<Project>(q.ToList());
return _projectList;
}
set
{
_projectList = value;
OnPropertyChanged("ProjectList");
}
public int SelectedProject
{
get { return _selectedProject; }
set
{
_selectedProject = value;
OnPropertyChanged("SelectedProject");
}
}
コマンドで実行される方法は、以下のように、コマンドがヒットし、メソッドが呼び出されているです。
public void DeleteProject()
{
if (SelectedProject != null)
{
ProjectList.Remove(SelectedProject);
}
}
私は 'Mode = TwoWay'を追加しましたが、これは問題を解決しませんでした。私はまた、SelectedItemは私が削除しようとしているアイテムを取得することを許可している必要がある理由を理解していない。 –
ユーザーがUI(表示)の選択を変更します。 Two-Way-Bindingでは、ViewModelsプロパティSelectedItemが更新されます。 私は自分の答えを編集し、有効な解決策を投稿します。 –
トーマス、ありがとう。私が理解できないことは、ブレークポイントをトレースすると、正しいselectedItemがViewModelに渡されたことがわかりますが、removeの呼び出しによってビューのリストが変更されることはありません。 –