【问题标题】:WPF ObjectDataProvider and ComboBoxWPF ObjectDataProvider 和 ComboBox
【发布时间】:2012-04-12 18:40:23
【问题描述】:

我已经上网几天试图解决这个问题,虽然我对 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;
    }

我知道我错过了什么,但我不知道是什么......

【问题讨论】:

    标签: wpf objectdataprovider


    【解决方案1】:

    我对 ObjectDataProvider 一无所知,但我会用另一种方式来解决这个问题。

    假设 MainWindow 是一个 WPF 窗口,其余的视图是 UserControls。 MainWindow ViewModel (AppVM) 将具有 PE​​RListVM 的属性,并在 MainWindow 的 XAML 中,并将 PERListView 的 DataContext 设置为 PERListVM 属性。

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

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

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

    【讨论】:

    • 至于 MessageBox 的我们——我只是在学习 MVVM 和 WFP。并且必须在时间限制的情况下这样做...至于您的其他 cmets,我已经尝试按照您的建议进行操作,但不知道该怎么做。我不知道如何称呼我需要的东西,不幸的是,我在这方面太新了,无法完全理解当我查看 MSDN 网站时被告知的内容......而且我真的需要检查 EvalItemView编辑...感谢您的 cmets !!!
    • 我为什么道歉,因为我重新阅读我的评论听起来很突然,并且没有寻求进一步的帮助......你能告诉我我将如何调用方法或检查属性ComboBox SelectedItem 设置器?我尝试了几种不同的方法,但似乎无法弄清楚。至于消息框,我将如何使用 MVVM 来更改消息框的使用?感谢您提供的任何/所有帮助!!!
    • 在咨询了一位同事后,我意识到,由于我是新手,我试图将代码放在错误的位置!!!当您说“setter”时,我没有意识到构造函数的 get/set 被称为“getter/setter”。我原以为你指的是代码隐藏形式,其中有一个 setter 动词。谢谢你的帮助!!!这解决了我的应用程序中的一个主要停止点!!!!
    • 嘿,很抱歉没有早点回复您,但我很高兴能够提供帮助,并感谢您将其标记为答案。至于 MessageBox 和 MVVM,有很多方法可以实现这一点,例如Josh Smith's solution,或者更多,如果你用谷歌搜索“mvvm messagebox”。要考虑的其他事情是使用 MVVM 框架,例如 MVVM light 或 Caliburn micro。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多