C# 如何将UserControl事件用于MainWindow

C# 如何将UserControl事件用于MainWindow,c#,wpf,mvvm,user-controls,C#,Wpf,Mvvm,User Controls,我正在使用MVVM模式创建一个WPF应用程序 在我的应用程序中,我有一个像应用程序的主模板一样工作的主窗口。我在UserControl中创建了一个类似于菜单的TreeView 在主窗口中,所有演示文稿都位于选项卡控件中,因此myTreeView中的每个项目实际上都是一个新选项卡 选项卡控件在主窗口上定义 因此,我的问题是,当TreeView的事件处理程序位于UserControls代码隐藏文件而不在主窗口文件中,因此我无法与它交互时,如何在当前选项卡控件中打开新选项卡(按TreeView中的项目

我正在使用MVVM模式创建一个WPF应用程序

在我的应用程序中,我有一个像应用程序的主模板一样工作的主窗口。我在
UserControl
中创建了一个类似于菜单的
TreeView

在主窗口中,所有演示文稿都位于选项卡控件中,因此my
TreeView
中的每个项目实际上都是一个新选项卡

选项卡控件在主窗口上定义

因此,我的问题是,当
TreeView
的事件处理程序位于
UserControls
代码隐藏文件而不在主窗口文件中,因此我无法与它交互时,如何在当前选项卡控件中打开新选项卡(按
TreeView
中的项目)


是否可以在主窗口的代码隐藏文件中托管
TreeView
的事件处理程序?

您应该可以这样做

Usercontrol.xaml

<TreeView SelectedItemChanged="TreeViewHandler" />
<local:myUsercontrol TreeViewSelectedItemChanged="myHandler" />

Usercontrol.cs

public delegate void TreeViewSelectedItemHandler(object sender, RoutedPropertyChangedEventArgs<object> e);
public event TreeViewSelectedItemHandler TreeViewSelectedItemChanged;

private void TreeViewHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Capture event from usercontrol and execute defined event
    if (TreeViewSelectedItemChanged != null)
    {
        TreeViewSelectedItemChanged(sender, e);
    }
}
private void myHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Do stuff
}
public委托void TreeViewSelectedItemHandler(对象发送方,RoutedPropertyChangedEventArgs e);
公共事件TreeViewSelectedItemHandler TreeViewSelectedItemChanged;
私有void TreeViewHandler(对象发送方,RoutedPropertyChangedEventArgs e)
{
//从usercontrol捕获事件并执行定义的事件
if(TreeViewSelectedItemChanged!=null)
{
TreeViewSelectedItemChanged(发送方,e);
}
}
Window.xaml

<TreeView SelectedItemChanged="TreeViewHandler" />
<local:myUsercontrol TreeViewSelectedItemChanged="myHandler" />

Window.cs

public delegate void TreeViewSelectedItemHandler(object sender, RoutedPropertyChangedEventArgs<object> e);
public event TreeViewSelectedItemHandler TreeViewSelectedItemChanged;

private void TreeViewHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Capture event from usercontrol and execute defined event
    if (TreeViewSelectedItemChanged != null)
    {
        TreeViewSelectedItemChanged(sender, e);
    }
}
private void myHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Do stuff
}
private void myHandler(对象发送方,RoutedPropertyChangedEventArgs e)
{
//做事
}

您应该能够执行类似的操作

Usercontrol.xaml

<TreeView SelectedItemChanged="TreeViewHandler" />
<local:myUsercontrol TreeViewSelectedItemChanged="myHandler" />

Usercontrol.cs

public delegate void TreeViewSelectedItemHandler(object sender, RoutedPropertyChangedEventArgs<object> e);
public event TreeViewSelectedItemHandler TreeViewSelectedItemChanged;

private void TreeViewHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Capture event from usercontrol and execute defined event
    if (TreeViewSelectedItemChanged != null)
    {
        TreeViewSelectedItemChanged(sender, e);
    }
}
private void myHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Do stuff
}
public委托void TreeViewSelectedItemHandler(对象发送方,RoutedPropertyChangedEventArgs e);
公共事件TreeViewSelectedItemHandler TreeViewSelectedItemChanged;
私有void TreeViewHandler(对象发送方,RoutedPropertyChangedEventArgs e)
{
//从usercontrol捕获事件并执行定义的事件
if(TreeViewSelectedItemChanged!=null)
{
TreeViewSelectedItemChanged(发送方,e);
}
}
Window.xaml

<TreeView SelectedItemChanged="TreeViewHandler" />
<local:myUsercontrol TreeViewSelectedItemChanged="myHandler" />

Window.cs

public delegate void TreeViewSelectedItemHandler(object sender, RoutedPropertyChangedEventArgs<object> e);
public event TreeViewSelectedItemHandler TreeViewSelectedItemChanged;

private void TreeViewHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Capture event from usercontrol and execute defined event
    if (TreeViewSelectedItemChanged != null)
    {
        TreeViewSelectedItemChanged(sender, e);
    }
}
private void myHandler(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    //Do stuff
}
private void myHandler(对象发送方,RoutedPropertyChangedEventArgs e)
{
//做事
}

@pilixonis如果答案对你合适,就接受它吧。谢谢。@pilixonis如果答案对你有用,就接受吧。谢谢