私はこれを理解しようと何日もオンラインになっていて、ObjectDataProvidersが何をどのように機能するかについて多くの洞察を得ていますが、それでもこれを解決することはできません...ビューモデルのメソッドにアクセスします。コンボボックスで選択が変更された後、このメソッドはフォームデータが編集されているかどうかを確認することになっています。含まれている場合、選択が変更される前に、編集された情報を保存するかどうかをユーザーに尋ねられます。コンボボックスのリストとメソッドの2つを結び付けることができないようです...コンボボックスを機能させることができますが、ItemsSourceとSelectedItemを逐語的に指定した場合に限ります。これらの値は、ロードされる残りのフォーム情報の基礎になります。あなたが言うことができないなら、私は初心者であり、これは私に来ないでしょう。もう1つ説明してから、コードについて説明します。私のアプリはレイヤーで構成されています-PERListViewを呼び出すMainWindowがあり、EvalItemViewを呼び出します。各ビューはViewModelに基づいています。つまり、MainWindowはAppVMを使用し、PERListViewはPERListVMを使用し、EvalItemViewはEvalItemVMを使用します。私が問題を抱えているコンボボックスはメインウィンドウにあり、編集中のデータはEvalItemViewにあります。したがって、私はObjectDataProviderを使用して、AppVMのSelectedNewPERListItemメソッドを取得しようとしています。このメソッドは、編集が行われたかどうかを確認し、変更を保存するかどうかをユーザーに尋ねてから、ComboBoxで使用されるリストを返すことになっています。ItemsSourceとしてコンボボックスで現在機能しているのはObservableCollectionであることに注意してください。また、SelectedItem(SelectedList)のタイプはPERListVMです。
OK ... ObjectDataProvider:
xmlns:viewmodel="clr-namespace:PERTrack.ViewModel"
<Window.Resources>
<ObjectDataProvider x:Key="PERListProvider" ObjectType="{x:Type viewmodel:AppVM}"
MethodName = "SelectNewPERListItem">
<ObjectDataProvider.MethodParameters>
<sys:Int32>1</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
ComboBox:
SelectedItem="{Binding SelectedList}" IsSynchronizedWithCurrentItem="True" Background="WhiteSmoke" >
<ComboBox.SelectedValue>
<Binding Source="{StaticResource PERListProvider}" BindsDirectlyToSource="True"
UpdateSourceTrigger="PropertyChanged" Mode="OneWay" />
</ComboBox.SelectedValue>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=PERList_ListID}" />
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
AppVMビューモデルのSelectNewPERListItemメソッド:
private PERListVM SelectNewPERListItem(object noParam)
{
if (_SelectedList != null)
{
if (_SelectedList.SelectedItem != null)
{
if (_SelectedList.SelectedItem.IsDirty)
{
System.Windows.Forms.DialogResult SaveEval;
SaveEval = System.Windows.Forms.MessageBox.Show("Do you wish to save your updates?", "User Action", System.Windows.Forms.MessageBoxButtons.YesNo);
// the user wants to save the updated information
if (SaveEval == System.Windows.Forms.DialogResult.Yes)
{
App.context.SaveChanges();
}
}
}
}
return _SelectedList;
}
何かが足りないのは知っていますが、それが何なのかわかりません...