WPF ObjectDataProvider and ComboBox



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

还行。。。对象数据提供程序:

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;
    }

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新