1

Ситуация: я создаю меню в котором есть действия, одно из действий должно переключить frame на следующий кадр/состояние.

Проблема: Оно не работает, хотя DataContext подключён и нету ошибок привязки.

Минимальный воспроизводимый пример: В App.xaml удаляем StartupUri( вроде так...), затем в App.xaml.cs пишем код:

public partial class App : Application
{
    private static Page one = new Page1();
    private static Page two = new Page2();
Tabs tabs = new Tabs() { One = one, Two = two, Current = one};

protected override void OnStartup(StartupEventArgs args)
{
    base.OnStartup(args);

    one.DataContext = tabs;
    two.DataContext = tabs;

    new MainWindow() { DataContext = tabs}.Show();
}

}

Создать Tab.cs и прописать вот это:

Минутка пояснения: этот код содержит страницы и команду открытия. Кнопка или что-то другое, вызывает команду с параметром страницы. Здесь RelayCommand для работы)

public 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&lt;object&gt; execute, Func&lt;object, bool&gt; canExecute = null)
{
    this.execute = execute;
    this.canExecute = canExecute;
}

public bool CanExecute(object parameter)
{
    return this.canExecute == null || this.canExecute(parameter);
}

public void Execute(object parameter)
{
    this.execute(parameter);
}

}

public class Tabs : INotifyPropertyChanged { private Page _One; private Page _Two;

public Page One
{
    get =&gt; _One;
    set
    {
        _One = value;
        OnPropertyChanged(&quot;selected&quot;);
    }
 }
 public Page Two
 {
     get =&gt; _Two;
     set
     {
        _Two = value;
        OnPropertyChanged(&quot;selected&quot;);
     }
 }

 private Page _Current;

 public Page Current
 {
    get =&gt; _Current;
    set
    {
        _Current = value;
        OnPropertyChanged(&quot;selected&quot;);
    }
}

public ICommand Open =&gt; new RelayCommand(obj =&gt; Current = (Page)obj);

public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}

}

Создаём страницы Page1 и Page2, в первой создаём кнопку:

<Button Content="1" Margin="10" FontSize="50" Command="{Binding Open}" CommandParameter="{Binding Two}"/>

Во второй:

<Button Content="2" Margin="10" FontSize="50" Command="{Binding Open}" CommandParameter="{Binding One}"/>

При запуске ничего не происходит.

Может я что-то опускаю?

Зонтик
  • 2,262
  • 2
  • 11
  • 39
  • 2
    OnPropertyChanged("selected"); везде замените на OnPropertyChanged(); параметром должно передаваться название свойства, но за вас это подцепит [CallerMemberName] – aepot Mar 13 '23 at 13:43
  • 1
    Ссылка в тему https://ru.stackoverflow.com/a/1266479/373567 – aepot Mar 13 '23 at 13:46
  • У меня было подобное, но другой подход. Можете посмотреть мой ответ в теме, решение которое помогло мне. https://ru.stackoverflow.com/questions/1504892/c-listbox-wpf-%d0%bf%d1%80%d0%b8%d0%b2%d1%8f%d0%b7%d0%ba%d0%b0-%d1%82%d0%b0%d0%b1%d0%bb%d0%b8%d1%86%d1%8b-entinty-framework – xellan Mar 15 '23 at 13:55

1 Answers1

3

Благодаря @aepot я смог решить проблему - убрав аргумент selected.

OnPropertyChanged("selected"); везде замените на OnPropertyChanged(); параметром должно передаваться название свойства, но за вас это подцепит [CallerMemberName]

Спасибо тем кто участвовал в решение проблемы

aepot
  • 49,560