0

При просмотре в отладке даже не вызывается команда. Сделано все по образцу, где ошибка никак не могу понять

RelayCommand

 public class RelayCommand<T> : ICommand
  {
 private Action<T> action;
 public RelayCommand(Action<T> action) => this.action = action;
 public bool CanExecute(object parameter) => true;
 #pragma warning disable CS0067
 public event EventHandler CanExecuteChanged;
 #pragma warning restore CS0067
 public void Execute(object parameter) => action((T)parameter);
  }

MainViewModel

public static ObservableCollection<NewArticlesViewModel> articles_list { get;set; }
public MainViewModel()
{

articles_list = new ObservableCollection<NewArticlesViewModel>(); LoadData(); } public ObservableCollection<NewArticlesViewModel> Articles_list { get { return articles_list; } set { articles_list = value; OnPropertyChanged("Articles_list"); } } private void LoadData() { Articles_list = b.GetArticles(); }

viewmodel

public ICommand RenameCommand { get; set; }
public NewArticlesViewModel (int id, string name, string category,string 
authorname, string text,string url, int authorid, string description, 
DateTime creationdate)

{ this.Id = id; this.Name = name; this.Category = category; this.Text = text; this.AuthorId = authorid; this.Description = description; this.CreationDate = creationdate; this.Url = url; this.AuthorName = authorname; RenameCommand = new RelayCommand<NewArticlesViewModel>(Rename); } private void Rename(NewArticlesViewModel article) { NewArticels.CurrentArticle = article; }

View

<ListBox   Background="Transparent" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  BorderThickness="0" RenderTransformOrigin="0.5,0.5" SelectedItem="{Binding SelectedArticle}" ItemsSource="{Binding Articles_list}" Grid.Row="3" VerticalAlignment="Top" Height="550" Grid.ColumnSpan="2" HorizontalAlignment="Left" Width="616"  >
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <ContentPresenter />
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Width="739" Height="520" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Width="151" Height="221" Margin="20 30 20 20">
                        &lt;Button  Command=&quot;{Binding RenameCommand}&quot; CommandParameter=&quot;{Binding}&quot; &gt;


            &lt;/Grid&gt;

        &lt;/DataTemplate&gt;
    &lt;/ListBox.ItemTemplate&gt;
&lt;/ListBox&gt;


mak
  • 71
  • Код где? Я вижу ShowNews = new MyCommands(ShowDetailNews);, ок, а где остальное? Где ShowNews? Также и кнопка, вы несколько вопросов подряд про ListBox спрашиваете, а тут просто кнопка, где она у вас? Внутри ListBox? И что за странная реализация команды? Где вы вообще передаете параметры? И да, хватит уже игнорировать метку C#... – EvgeniyZ May 20 '21 at 17:04
  • @EvgeniyZ отредактировано. Да, кнопка в listbox. Подозреваю, что проблема в самом классе MyCommands, потому что я не могу получить параметры в самой реализации команды, но не совсем понимаю, где – mak May 20 '21 at 17:17
  • Да, кнопка в listbox - тогда почему у вас команда в главном VM, где предположу, у вас сама коллекция с объектами? Ну и также, как я сказал выше, где в вашей команде передача параметров? Ну то есть обычно, параметры команды передаются так SomeCommand = new DelegateCommand<string>(arg => SomeMethod(arg)); и далее void SomeMethod(string arg){ //Делаем что-то с arg }, где у вас это? – EvgeniyZ May 20 '21 at 17:18
  • @EvgeniyZ прописав SomeCommand = new MyCommands(arg => SomeMethod(arg)); оно светит ошибку. Подозреваю, для того, чтобы не светило, надо что-то изменить сам класс MyCommands. Не могли бы вы подсказать что именно, пожалуйста? – mak May 20 '21 at 17:43
  • 1
    Конечно будет ошибка) У вас весьма странная реализация ICommand) Поищите любую другую, удобную для вас реализацию. Например, можете взять как здесь, самая минимальная, лишь выполнение, без CanExecute, можете взять от сюда - параметры передаются через лямбду как object, в методе надо будет преобразовать в нужный тип. Реализаций полно, можете сами погуглить по запросу wpf icommand implementation, либо написать свою реализацию. – EvgeniyZ May 20 '21 at 17:53
  • https://ru.stackoverflow.com/a/1282902/373567 – aepot May 20 '21 at 18:00
  • Вопрос в порядок приведите, ни единого пробела, все в одну кашу... Вам самим приятно это читать? Также почему public static ObservableCollection<NewArticlesViewModel> articles_list { get;set; }? Это должно быть приватным полем, которое вообще не используется где либо, лишь в свойстве. Ну и как вы поняли, что "не работает"? Точку остановки на строке NewArticels.CurrentArticle = article; ставили? При нажатии на кнопку попадает туда? – EvgeniyZ May 21 '21 at 22:12
  • @EvgeniyZ не попадает в отладке туда – mak May 21 '21 at 22:18
  • Делайте тогда минимальный, самодостаточный пример, чтобы мы могли воспроизвести проблему. – EvgeniyZ May 21 '21 at 22:20
  • Я вон даже проверил ваш код, скопировал ваш c# (убрав лишнее для простоты), скопировал прям целиком ваш XAML (добавил лишь закрывающий слеш у кнопки), как видите, все работает... – EvgeniyZ May 21 '21 at 22:37
  • Спасибо большое за помощь, буду разбираться) – mak May 21 '21 at 22:38

0 Answers0