【发布时间】:2017-11-21 06:14:04
【问题描述】:
我试图在 UserControl1 中引发一个事件,但我不知道如何处理该事件以在 MainWindow 中显示 UserControl2。
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel1 />
</Window.DataContext>
<Window.Resources>
<DataTemplate x:Key="Template1" DataType="{x:Type local:ViewModel1}">
<local:UserControl1 />
</DataTemplate>
<DataTemplate x:Key="Template2" DataType="{x:Type local:ViewModel1}">
<local:UserControl2 />
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding }">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource Template1}" />
<Style.Triggers>
<DataTrigger Binding="{Binding UserControlId}" Value="2">
<Setter Property="ContentTemplate" Value="{StaticResource Template2}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</Grid>
</Window>
MainWindow.cs
using System.Windows;
namespace WpfApp1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
UserControl1.xaml
<UserControl x:Class="WpfApp1.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Label Content="User Control 1" />
<Button x:Name="btnNext" Content="Next" Click="btnNext_Click"></Button>
</Grid>
</UserControl>
UserControl1.cs
using System.Windows;
using System.Windows.Controls;
namespace WpfApp1
{
public partial class UserControl1 : UserControl
{
public static readonly RoutedEvent MyEvent = EventManager.RegisterRoutedEvent(
"MyEventName",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(UserControl1)
);
public event RoutedEventHandler LoginEventHandler
{
add { AddHandler(MyEvent, value); }
remove { RemoveHandler(MyEvent, value); }
}
public UserControl1()
{
InitializeComponent();
}
private void btnNext_Click(object sender, RoutedEventArgs e)
{
var eventArgs = new RoutedEventArgs(MyEvent);
RaiseEvent(eventArgs);
}
}
}
UserControl2.xaml
<UserControl x:Class="WpfApp1.UserControl2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Label Content="User Control 2" />
</Grid>
</UserControl>
UserControl2.cs
using System.Windows.Controls;
namespace WpfApp1
{
public partial class UserControl2 : UserControl
{
public UserControl2()
{
InitializeComponent();
}
}
}
ViewModel1.cs
using System.ComponentModel;
namespace WpfApp1
{
public class ViewModel1 : INotifyPropertyChanged
{
public int UserControlId { get; set; }
public ViewModel1()
{
UserControlId = 2;
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
我想我必须更新 ViewModel1 中的 UserControlId 属性来更改用户控件,但是在哪里处理以及如何获取 ViewModel1 实例来更改属性?
编辑 1 抱歉 ViewModel1 构造函数中的拼写错误,我打算将 UserControlId 属性初始化为 1,而不是 2。
当我运行它时,我看到在主窗口中加载了 UserControl1 的窗口。 UserControl1 有一个“下一步”按钮。 单击 UserControl1 中的按钮时,我想显示 UserControl2。 所以我在按钮单击事件处理程序中引发 MyEvent 路由事件。 现在,在哪里附加和编写 MyEvent 的事件处理程序以及如何获取 ViewModel1 实例来更改它的 UserControlId 属性?
【问题讨论】:
-
您可以使用例如 caliburn.micro 来执行此操作,请参阅 caliburnmicro.com/documentation/event-aggregator
标签: wpf