C# 使用命令激发usercontrol方法

C# 使用命令激发usercontrol方法,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我需要一些帮助,我希望你能帮助我。我有一个复杂的usercontrol,它有一个方法可以更改其中所有元素的颜色。当我尝试将它与主窗口代码中的方法存根连接时,我可以很容易地启动它。我想在将来使用MVVM,所以现在我想通过命令将它连接到主窗口中的一个按钮 这是我的ViewModel和MainWindow.cs public class ViewModel { public DelegateCommands TestCommand { get; private set; } pub

我需要一些帮助,我希望你能帮助我。我有一个复杂的usercontrol,它有一个方法可以更改其中所有元素的颜色。当我尝试将它与主窗口代码中的方法存根连接时,我可以很容易地启动它。我想在将来使用MVVM,所以现在我想通过命令将它连接到主窗口中的一个按钮

这是我的ViewModel和MainWindow.cs

public class ViewModel
{ 
    public DelegateCommands TestCommand { get; private set; }

    public ViewModel()
    {
        TestCommand = new DelegateCommands(OnExecute, CanExecute);

    }

    bool CanExecute(object parameter)
    {
        return true;
    }

    void OnExecute()
    {

        //testUC.NewColor(); HERE I WANT TO START THE UC-METHOD
    }
}




 public partial class MainWindow : Window
{
    ViewModel _ViewModel = null;
    public plate tplate;

    public MainWindow()
    {
        InitializeComponent();

        _ViewModel = new ViewModel();


    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        tplate = new plate();
    }
}
在我的主窗口视图中,我有一个简单的按钮和用户控件

<exte:plate x:Name="testUC" Grid.Column="1"/>
<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="43,247,0,0" Command="{Binding TestCommand}"/>

我想在OnExecute()方法中启动UC方法,但我无法选择“testUC”,因为它在此上下文中不可用

是否有一种通过命令绑定启动UC方法的简单方法

谢谢你的帮助


Timo

如何解决您的绑定问题。首先,大多数绑定都与最特定的
DataContext
相关。也就是说,你必须设置你的控制。例如

公共类MySpecialButton:按钮
{
公共MySpecialButton()
{
DataContext=this;//还有其他可能性,但这是最简单的一种
}
}
有了它,您可以绑定在
MySpecialButton
中实现的每个命令

另一种可能是对相对源使用绑定。例如


您甚至可以使用上面示例中的方法声明
DataContext


希望这对您有所帮助。

好的,我尝试了您描述的后一种方式(“Button”是我要用来触发该方法的按钮,“NewPlate”是方法名称,exte:plate是customcontrol类型):


但同样,什么也没发生


为了正确理解您的第一个建议,我必须将自定义控件声明为按钮而不是用户控件?我不明白,我必须把datacontext放在哪里。我只是使用一个标准的wpf按钮来触发自定义控件方法。我没有任何可以声明datacontext的按钮类

由于颜色是视觉外观,因此没有理由将此逻辑放入VM中。所以,如果你能让它运行,你可以坚持你的方法。谢谢你的回答。它甚至不仅仅是颜色,它还用于偏移和其他方法。我想从devexpress ribbonbutton启动它(不需要任何单击或类似事件),因此我需要命令方式。听起来你在实现一个
自定义控件
。通常,您会在控件的代码隐藏中实现这些东西。但是,您可以通过绑定到控件来使用
ICommand
方法。再次感谢你的回答。很抱歉将自定义与用户控件混淆。。。嗯,我想,我将使用代码隐藏来进行控制,但是我想知道这应该如何与命令一起工作。我试着用主要问题部分的代码,但是如果我点击按钮,什么都不会发生(即使在调试模式下)。嘿。再次感谢。我会尝试一下,让你知道它是如何工作的。
<Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="43,247,0,0" Command="{Binding NewPlate, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type exte:plate}}}" />