【发布时间】: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;
}
我知道我错过了什么,但我不知道是什么......
【问题讨论】: