【发布时间】:2016-01-27 12:03:42
【问题描述】:
我有一个 CateringMenuView,我通过单击菜单在 UserControls 之间导航,它工作正常。
我正在使用以下模式:
https://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/
在其中一个用户控件 (NewRegularOrderView) 中有一个按钮。通过单击此按钮,我想导航到另一个用户控件。为了做到这一点,我使用了我在这里的答案:
Navigate between UserControls with Event Aggegator
但是当我点击按钮时没有任何反应。
你能帮忙找出原因吗?
CateringMenuView
<UserControl.Resources>
<DataTemplate DataType="{x:Type cvm:NewDeliveryComOrderViewModel}">
<cv:NewDeliveryComOrderView/>
</DataTemplate>
<DataTemplate DataType="{x:Type cvm:NewRegularOrderViewModel}">
<cv:NewRegularOrderView/>
</DataTemplate>
<DataTemplate DataType="{x:Type cvm:FillOrderViewModel}">
<cv:FillOrderView/>
</DataTemplate>
<cvm:CateringMenuViewModel x:Key="menu"/>
</UserControl.Resources>
<Grid DataContext="{Binding Source={StaticResource menu}}">
<StackPanel>
<Menu>
<MenuItem Header="New Order">
<ItemsControl ItemsSource="{Binding PageViewModels}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink Command="{Binding ChangePageCommand, Mode=OneWay, Source={StaticResource menu}}" CommandParameter="{Binding}" TextDecorations="{x:Null}">
<InlineUIContainer>
<TextBlock Text="{Binding Name}"/>
</InlineUIContainer>
</Hyperlink>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</MenuItem>
</Menu>
</StackPanel>
<Border Grid.Row="1" BorderThickness="1" CornerRadius="8" >
<ContentControl Content="{Binding CurrentUserControl}" Margin="0,0,-1,0"/>
</Border>
</Grid>
CateringMenuViewModel
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
PageViewModels.Add(new NewRegularOrderViewModel());
PageViewModels.Add(new NewDeliveryComOrderViewModel());
PageViewModels.Add(new FillOrderViewModel());
// Set starting page
CurrentUserControl = PageViewModels[0];
}
#region Fields
private List<IUserContentViewModel> _pageViewModels;
public List<IUserContentViewModel> PageViewModels
{
get
{
if (_pageViewModels == null)
_pageViewModels = new List<IUserContentViewModel>();
return _pageViewModels;
}
}
private IUserContentViewModel _currentUserControl;
public IUserContentViewModel CurrentUserControl
{
get { return _currentUserControl; }
set
{
if (value != _currentUserControl)
{
_currentUserControl = value;
OnPropertyChanged("CurrentUserControl");
}
}
}
#region Methods
private void ChangeViewModel(IUserContentViewModel viewModel)
{
if (!PageViewModels.Contains(viewModel))
PageViewModels.Add(viewModel);
CurrentUserControl = PageViewModels
.FirstOrDefault(vm => vm == viewModel);
}
#endregion
private ICommand _changePageCommand;
#endregion
public ICommand ChangePageCommand
{
get
{
if (_changePageCommand == null)
{
_changePageCommand = new RelayCommand(
p => ChangeViewModel((IUserContentViewModel)p),
p => p is IUserContentViewModel);
}
return _changePageCommand;
}
}
}
现在,当我在 NewRegularOrderView 上时,我想单击一个按钮导航到 FillOrderView。
ChangeViewModel(IUserContentViewModel viewModel)中的视图改得很好 但它没有在 RelayCommand 中执行
NewRegularOrderView
<UserControl.Resources>
<cvm:CateringMenuViewModel x:Key="menu"/>
</UserControl.Resources>
<Border Grid.Row="2" Margin="10, 5" BorderBrush="Black" CornerRadius="8" BorderThickness="2">
<Button DataContext="{Binding Source={StaticResource menu}}"
Command="{Binding ChangePageCommand}"
CommandParameter ="{Binding PageViewModels[2]}"/>
</Border>
FillOrderView 和 ViewModel
public class FillOrderViewModel : ViewModelBase, IUserContentViewModel
{
public FillOrderViewModel() {}
public string Name
{
get
{
return "Fill Order";
}
}
}
<UserControl.Resources>
<cvm:FillOrderViewModel x:Key="fill"/>
</UserControl.Resources>
<Grid DataContext="{Binding Source={StaticResource fill}}">
<DataGrid Margin="405,100,395,110" >
</DataGrid>
</Grid>
更新
轻松回答here
【问题讨论】:
-
我想我现在知道你的问题是什么了,但是之前的一个问题,你想换成
NewDeliveryComOrderView或者FillOrderView? -
@Kirenenko NewRegularOrderView 到 FillOrderView
-
我认为问题与上一个问题相同...您必须将此代码添加到您的
CateringMenuView UserControl.Resources:<DataTemplate DataType="{x:Type cvm:FillOrderViewModel}"> <cv:FillOrderView/> </DataTemplate>。如果这不是失败,至少这是失败的“一部分”。 -
@Kirenenko 不,我添加了它。
-
尝试在
NewRegularOrderView命令中使用与CateringMenuView命令中相同的参数:Command="{Binding ChangePageCommand, Mode=OneWay, Source={StaticResource menu}}"。如果这不起作用,请检查您的 FillOrderViewModel 构造函数是否被调用。
标签: c# wpf user-controls