问题描述
我将主窗口分为 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);
}
}
}