【发布时间】:2011-07-08 10:26:56
【问题描述】:
我有一个 5 页的 WPF 应用程序。在我的主窗口上,我有 5 个按钮。我想做的是单击按钮 1 在主窗口的框架中打开第 1 页。我不想使用导航窗口。我应该使用某种绑定吗?我想用xmal,代码越少越好。在此先感谢我正在学习阶段!
【问题讨论】:
我有一个 5 页的 WPF 应用程序。在我的主窗口上,我有 5 个按钮。我想做的是单击按钮 1 在主窗口的框架中打开第 1 页。我不想使用导航窗口。我应该使用某种绑定吗?我想用xmal,代码越少越好。在此先感谢我正在学习阶段!
【问题讨论】:
您可以将按钮的Click 事件处理程序设置为使用它们各自的页面调用Frame.Navigate(Uri)。
在 XAML 中:
<Frame Name="myFrame"/>
<Button Name="buttonPage1" Click="OnClickPage1">
Page1
</Button>
然后在后面的代码中:
void OnClickPage1(object sender, RoutedEventArgs e)
{
myFrame.Navigate(new Uri("page1"));
}
【讨论】:
我认为您的 cmets 的逻辑后续是按下按钮 2 将打开第 2 页等。
我的建议,这适用于所有 WPF 开发,是采用 MVVM。它将为您提供更多的灵活性和可测试性。
在 MVVM 中实现您的问题:
为您的每个视图创建 ViewModel,并为您的主窗口创建一个
每个 ViewModel 都成为其各自 View 的 DataContext。
在 MainWindowViewModel 中实现 5 个 ICommand 属性,并将按钮上的 Command 属性绑定到 MainWindowViewModel 上每个对应的 ICommand 属性。
在主窗口上,我不确定您是否正在实现 Frame 控件,但我建议使用 ContentControl,将控件上的 Content 属性绑定到 MainWindowViewModel 上的某个 Object 类型的属性。
在每个 ICommand 对象的执行中,您可以将 MainWindowViewModel 上的 content 属性设置为该按钮的匹配 ViewModel。
在 MainWindowView.xaml 中,您需要实现一系列将 ViewModel 映射到 View 的 DataTemplate:
<DataTemplate DataType="{x:Type Page1ViewModel}">
<AdornerDecorator>
<views:Page1View DataContext="{Binding}"/>
</AdornerDecorator>
</DataTemplate>
我建议您考虑使用众多可用的 MVVM 框架之一。
MVVMFoundation - 重量轻,最低限度的实现
MVVMLight - 更重的框架
Caliburn - 似乎有很多附加功能
实现一个完整的框架可能看起来需要做很多额外的工作,但从长远来看,这将是值得的,更可测试,更可维护。
【讨论】: