1

I've been struggling with this issue for a while now, tried all of the answers I have seen so far and I still get the same error message

Cannot find source: RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Menu', AncestorLevel='1'.

And my button does nothing

What I'm trying to accomplish

I have this main window called Menu which has a content control and a top bar menu. The idea is that when I press a button from the homeView it changes the mainView to the one selected.

I have already tried this solution WPF MVVM navigate views but got this error message as a result. What I can do for the moment is change views using the top bar on the Menu window but I can not make the childView to execute a command from the parentView

Here's what I have

In my menu window

<Window.DataContext>
       <viewModel:MenuPrincipalVistaControlador/>
</Window.DataContext>
<TheThingsInsideMyWindow/> 
<ContentControl Grid.Row="1" Margin="0" Content="{Binding vistaActual}"/>

where vistaActual is a reference to a property currentView in my main ViewModel

My data templates

<DataTemplate DataType="{x:Type viewModel:CasaVistaControlador}">
    <view:MenuInicioVista/>
</DataTemplate>
<DataTempate DataType="{x:Type viewModel:CajaVistaControlador}">
    <view:CajaVista/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:AgregarUsuarioVistaControlador}">
    <view:VistaAgregarUsuario/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:AjusteVistaControlador}">
    <view:AjustesVista/>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:CitaVistaControlador}">
    <view:CitaVista/>
</DataTemplate>

Inside of my HomeView

<Button x:Name="btnCitas" Height="150" Width="150" Margin="250,80,0,0" VerticalAlignment="Top"  Style="{StaticResource MaterialDesignRaisedButton}" RenderTransformOrigin="0.496,2.246" materialDesign:ButtonAssist.CornerRadius="10" FontFamily="Bahnschrift" FontSize="20" BorderBrush="{x:Null}" Command="{Binding Path=DataContext.CitaVistaComando , RelativeSource={RelativeSource AncestorType={x:Type Menu}}}" />

Classes

Part of me thinks it might be something on my base classes that's making the bind to not work so going from here will be the classes that make everything work

My MainViewModel (datacontext for menu)

class MenuPrincipalVistaControlador: ObservableObject
{
    public CasaVistaControlador CasaVista { get; set; }
    public CajaVistaControlador CajaVista { get; set; }
    public CitaVistaControlador CitaVista { get; set; }
    private object _vistaActual;
    public RelayCommand CasaVistaComando { get; set; }
    public RelayCommand CajaVistaComando { get; set; }
    public RelayCommand CitaVistaComando { get; set; }

    public object vistaActual
    {
        get { return _vistaActual; }
        set { _vistaActual = value;
            OnPropertyChanged();
        }
    }

    public MenuPrincipalVistaControlador()
    {
        CasaVista = new CasaVistaControlador();
        CajaVista = new CajaVistaControlador();
        vistaActual = CasaVista;
        CasaVistaComando = new RelayCommand(o =>
        {
            vistaActual = CasaVista;
        });
        CajaVistaComando = new RelayCommand(o =>
        {
            vistaActual = CajaVista;
        });
        CitaVistaComando = new RelayCommand(o =>
        {
            vistaActual = CitaVista;
        });
    }
}

My ObservableObject class

class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

My custom RelayCommand class

class RelayCommand :ICommand
{
    private Action<object> _execute;
    private Func<object, bool> _canExecute;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public RelayCommand (Action<object> execute,Func<object,bool>canExecute=null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute (object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Noosqui
  • 11
  • 2
  • A good strategy is always to create the smallest application possible to show the issue. Do you really need all these datatemplates and commands to demonstrate what is going wrong? It may help you and us to see easier what is wrong. For me personally the use of Spanish language in variable names and so is not very helpful either. – RudolfJan Jul 19 '21 at 05:55
  • Thanks, im new to github. Ended up resolving the issue by myself so I will close this one but I will keep in mind your points for future questions. – Noosqui Jul 19 '21 at 07:03
  • Good to hear you solved it. – RudolfJan Jul 20 '21 at 09:13

0 Answers0