使用子按钮设置 MainWindow 的 ContentControl

问题描述

My application

我将主窗口分为 3 部分,左右部分允许用户选择显示在中间面板上的私人消息或公共频道。我的问题是侧面允许显示正确 UserControl 的按钮是一个孩子的孩子的孩子,我不知道如何从这么多孩子中修改 MainWindow 的 ContentControl。

在我的 MainWindow 里面,我有一个 ContentControl 显示正确的 Control(Chatviewmodel 是一个 UserControl,我只是懒得重命名

<ContentControl Grid.Row="1" Grid.Column="1" DataContext="{Binding Selection}" x:Name="MainPanel">
        <ContentControl.Resources>
            <DataTemplate DataType="{x:Type chat:UserMessages}">
                <chat:Chatviewmodel DataContext="{Binding Selection}"/>
            </DataTemplate>

            <DataTemplate DataType="{x:Type channel:ChannelClass}">
                <channel:PrintChannel DataContext="{Binding Selection}"/>
            </DataTemplate>
        </ContentControl.Resources>
    </ContentControl>

Selection 是我在 MainWindow 的 C# 代码中声明的一个变量。我查看了依赖属性和其他东西,但我什么也做不了。即使答案不漂亮,我也需要它来工作!

解决方法

一个没有小细节的简单例子。
我想你很容易理解。
如果你需要澄清一些事情 - 写。

using Simplified;
using System.Windows;

namespace BindingRoutedCommand
{
    public class MainViewModel
    {
        private RelayCommand _exampleCommand;

        public RelayCommand ExampleCommand => _exampleCommand
            ?? (_exampleCommand = new RelayCommand(p => MessageBox.Show($"Hi {p}!")));
    }
}
using System.Windows.Input;

namespace BindingRoutedCommand
{
    public static class MyRoutedCommands
    {
        public static RoutedUICommand Hello { get; } = new RoutedUICommand(nameof(Hello),nameof(Hello),typeof(MyRoutedCommands));
    }
}
<UserControl x:Class="BindingRoutedCommand.ExampleUC"
             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:BindingRoutedCommand"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Button Content="Say hello" Padding="15 5"
                Command="{x:Static local:MyRoutedCommands.Hello}"
                CommandParameter="Dave"/>
    </Grid>
</UserControl>
<Window x:Class="BindingRoutedCommand.ExampleWindow"
        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:BindingRoutedCommand"
        mc:Ignorable="d"
        Title="ExampleWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Window.CommandBindings>
        <CommandBinding Command="{x:Static local:MyRoutedCommands.Hello}"
                        Executed="OnExecutedHello"/>
    </Window.CommandBindings>
    <Grid>
        <local:ExampleUC VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Grid>
</Window>
using Simplified;
using System.Windows;

namespace BindingRoutedCommand
{
    public partial class ExampleWindow : Window
    {
        public ExampleWindow()
        {
            InitializeComponent();
        }

        private void OnExecutedHello(object sender,System.Windows.Input.ExecutedRoutedEventArgs e)
        {
            MainViewModel viewModel = (MainViewModel)DataContext;
            viewModel.ExampleCommand.TryExecute(e.Parameter);
        }
    }
}