Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF ObjectDataProvider和组合框_Wpf_Objectdataprovider - Fatal编程技术网

WPF ObjectDataProvider和组合框

WPF ObjectDataProvider和组合框,wpf,objectdataprovider,Wpf,Objectdataprovider,我已经上网好几天了,试图弄明白这个问题,虽然我对ObjectDataProviders的工作原理有了很多了解,但我仍然无法解决这个问题。。。我正在尝试使用ObjectDataProvider访问viewmodel中的方法。在组合框中更改选择后,此方法应检查表单数据是否已编辑。如果有,将询问用户是否希望在选择更改之前保存编辑的信息。我似乎无法将两者联系在一起-组合框列表和方法。。。我可以让组合框正常工作,但前提是我指定ItemsSource并选择EdItem verbatim。这些值是加载其余表单

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

好的。。。 ObjectDataProvider:

xmlns:viewmodel="clr-namespace:PERTrack.ViewModel"

<Window.Resources>

    <ObjectDataProvider x:Key="PERListProvider" ObjectType="{x:Type viewmodel:AppVM}" 

我知道我遗漏了一些东西,但我不知道它是什么…

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

假设MainWindow是一个WPF窗口,其余视图都是用户控件。MainWindow ViewModel(AppVM)将具有PERListVM的属性,在XAML中具有MainWindow的属性,并将PERListView的DataContext设置为PERListVM属性

组合框SelectedItem绑定AppVM上的属性,因此在该属性的setter中,如果表单数据已编辑,则调用方法或检查PERListVM上的属性

如果不清楚,请通过评论让我知道


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

至于MessageBox的美国,我只是在学习MVVM和WFP。而且必须在时间限制下完成。。。至于你的其他评论,我试着按照你的建议去做,但不知道怎么做。我不知道如何称呼我需要的,不幸的是,我在这方面太新了,无法完全理解我在查看MSDN网站时被告知的内容。。。我真的需要检查EvalItemView的编辑。。。谢谢你的评论!!!我对此深表歉意,因为我重读了我的评论,听起来相当唐突,没有要求进一步的帮助。。。您能确切地告诉我如何在组合框SelectedItem setter中调用方法或检查属性吗?我已经尝试了几种不同的方法,但似乎无法解决。至于Messagebox,如何使用MVVM来改变Messagebox的使用?感谢您提供的任何/所有帮助!!!在咨询了一位同事后,我意识到,由于我是新手,我试图把代码放在错误的地方!!!当你说“setter”时,我没有意识到构造函数的get/set被称为“getter/setter”。我以为你指的是表单代码后面有一个setter动词。谢谢你的帮助!!!这解决了我的应用程序中的一个主要停止点!!!!嘿,很抱歉没有早点给你回复,但我很高兴我能帮上忙,谢谢你的回答。至于MessageBox和MVVM,有很多方法可以实现这一点,例如,如果你在google上搜索“MVVM MessageBox”,可以使用更多的方法。另外要考虑的是使用MVVM框架,如MVVM光或CaleBube微。
        <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>
    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;
    }