0

我已经上网好几天了,试图弄清楚这个问题,虽然我对 ObjectDataProviders 的工作原理和方式有了很多深入的了解,但我仍然无法解决这个问题……我正在尝试使用 ObjectDataProvider 来解决这个问题访问我的视图模型中的方法。在组合框中更改选择后,此方法应该检查表单数据是否已被编辑。如果有,将询问用户是否要在选择更改之前保存编辑的信息。我似乎无法将两者联系在一起 - 组合框的列表和方法......我可以让组合框工作,但前提是我逐字指定 ItemsSource 和 SelectedItem。这些值是加载我的其余表单信息的基础。如果你看不出来,我是个新手,这个不会来找我的。再解释一下,然后我将进入代码。我的应用程序是分层结构的 - 我有 MainWindow,它调用 PERListView,它调用 EvalItemView。每个View都基于一个ViewModel,即MainWindow使用AppVM,PERListView使用PERListVM,EvalItemView使用EvalItemVM。我遇到问题的组合框在 MainWindow 中,而正在编辑的数据在 EvalItemView 中。因此,我试图使用 ObjectDataProvider 来获取 AppVM 中的 SelectedNewPERListItem 方法。此方法检查是否已进行编辑,询问用户是否希望保存更改,然后应该返回 ComboBox 使用的列表。应该注意的是,当前在组合框中作为 ItemsSource 工作的是 ObservableCollection。并且 SelectedItem (SelectedList) 是 PERListVM 类型。

好的... 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>

组合框:

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) 将具有 PE​​RListVM 的属性,并在 MainWindow 的 XAML 中,并将 PERListView 的 DataContext 设置为 PERListVM 属性。

ComboBox SelectedItem 绑定了 AppVM 上的一个属性,所以在这个属性的 setter 中,如果表单数据被编辑过,就调用一个方法或者检查 PERListVM 上的一个属性。

如果不清楚,请通过评论告诉我。

顺便说一句,您还应该重新考虑使用 MessageBox 的方法。调用 MessageBox.Show() 不适用于 MVVM,但这是一个单独的问题。

于 2012-04-13T08:35:07.717 回答