首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ObjectDataProvider和ComboBox

WPF ObjectDataProvider和ComboBox
EN

Stack Overflow用户
提问于 2012-04-13 02:40:23
回答 1查看 1.2K关注 0票数 0

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

好的..。ObjectDataProvider:

代码语言:javascript
复制
xmlns:viewmodel="clr-namespace:PERTrack.ViewModel"

<Window.Resources>

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

MethodName="SelectNewPERListItem“>

代码语言:javascript
复制
        <ObjectDataProvider.MethodParameters>

            <sys:Int32>1</sys:Int32>

        </ObjectDataProvider.MethodParameters>

    </ObjectDataProvider> 

</Window.Resources>

ComboBox:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
    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;
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-13 16:35:08

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

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

ComboBox SelectedItem绑定AppVM上的属性,因此,如果表单数据已编辑,则在此属性的设置器中调用方法或检查PERListVM上的属性。

如果这一点不清楚,请通过评论让我知道。

顺便说一句,你也应该重新考虑你使用MessageBox的方法。在MVVM中调用MessageBox.Show()不是很合适,但这是一个独立的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10129745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档