0

私はこれを理解しようと何日もオンラインになっていて、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;
    }

何かが足りないのは知っていますが、それが何なのかわかりません...

4

1 に答える 1

0

ObjectDataProviderについては何も知りませんが、別の方法でアプローチします。

MainWindowがWPFウィンドウであり、残りのビューがUserControlsであるとしましょう。MainWindow ViewModel(AppVM)には、PERListVMのプロパティがあり、MainWindowのXAMLには、PERListViewのDataContextをPERListVMプロパティに設定します。

ComboBox SelectedItemはAppVMのプロパティをバインドするため、このプロパティのセッターでメソッドを呼び出すか、フォームデータが編集されている場合はPERListVMのプロパティを確認します。

不明な点がある場合は、コメントでお知らせください。

ところで、MessageBoxを使ってアプローチを再考する必要もあります。MessageBox.Show()を呼び出すことは、MVVMにはあまり適していませんが、それは別の問題です。

于 2012-04-13T08:35:07.717 に答える