locked
ICommand в MVVM RRS feed

  • Вопрос

  • Есть ListView'шка. Каждый элемент содержит в себе кроме текста, картинок и так далее, кнопку. Необходимо привязать к кнопке действие. Проблема в том, что нажатие на кнопку никак не отрабатывается

    !--Низ страницы-->
    <Grid Grid.Row="6">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
      </Grid.ColumnDefinitions>
        <Button Content="Мне нравится"  Command="{Binding LikeCommand}"/>
    </Grid> 

    вот ViewModel

    public class MainViewModel : ViewModel, INotifyPropertyChanged
        {
            private ObservableCollection<FeedItem> _feedItems;
            /// <summary>
            /// Коллекция новостей
            /// </summary>
            public ObservableCollection<FeedItem> FeedItems
            {
                get { return _feedItems; }
                set
                {
                    _feedItems = value;
                    RaisePropertyChanged();
                }
            }
    
            private ObservableCollection<User> _users;
            /// <summary>
            /// Коллекция контактов он-лайн
            /// </summary>
            public ObservableCollection<User> Users
            {
                get { return _users; }
                set
                {
                    _users = value;
                    RaisePropertyChanged();
                }
            }
    
            public MainViewModel()
            {
                LikeCommand = new DelegateCommand(LikeAction);
                Main();
            }
    
            private async void Main()
            {
                if (await Authorization.Authorize(false))
                {
                    await Friends.DownloadFriendsAsync(); // Скачали друзей из вконтакта
                    ContactsOnline(); // Вывели друзей-онлайн на экран
                    FeedsDownloadAsync(); // Вывели список но
                }
            }
    
            private async void ContactsOnline()
            {
                Users = await Friends.DownloadOnlineFriendsAsync();
            }
    
            private async void FeedsDownloadAsync(int offset = 0)
            {
                FeedItems = await Feeds.GetFeedsAsync(0);
            }
    
            #region Команды
    
            public event PropertyChangedEventHandler propertyChanged = null;
            public ICommand LikeCommand { get; set; }
    
            private void LikeAction(object param)
            {
                //someAction
                new MessageDialog("Like Action in work").ShowAsync();
            }
    
    
            #endregion

    вот DelegateCommand

    public class DelegateCommand : ICommand
        {
            private Action<object> executeAction;
    
            public DelegateCommand(Action<object> executeAction)
            {
                this.executeAction = executeAction;
            }
            public bool CanExecute(object parameter)
            {
                return true;
            }
    
            public void Execute(object parameter)
            {
                executeAction(parameter);
            }
    
            public event EventHandler CanExecuteChanged = null;
        }

    Вроде бы все правильно. Я грешу на привязку источника данных в ListView

    <ListView Grid.Column="1"
                      ItemsSource="{Binding FeedItems}"
                      ItemTemplate="{StaticResource FeedTemplate}"
                      Width="968" SelectionMode="None" Margin="5,0,-7,0" />

    Но, если проблема действительно в нем, то как же грамотно сделать?

    Помогите, пожалуйста

    10 октября 2013 г. 13:27

Ответы

  • Посмотрите в Output, нет ли Binding error. Так же, по ксамлу видно, что кнопка лежит не в дата темплейте листвью, это верно? Просто если она будет лежать в дататемплейте у листвью, то у кнопки будет Датаконтекст этого же листвью, соответственно она ничего кроме коллекции которую вы скормили листвью видеть не будет. Вам нужно будет после Binding LikeCommandдописать Souce={StaticResource ViewModel}
    • Помечено в качестве ответа evgeniy.polonskiy 10 октября 2013 г. 14:07
    10 октября 2013 г. 13:54

Все ответы

  • Добрый день.

    У вас только команда не привязывается или вообще ничего не привязывается?

    10 октября 2013 г. 13:36
    Отвечающий
  • Добрый день,

    Привязка к объектам FeedItems и Users прекрасно работает (это два разных листВью)

    А вот как забиндить действие в элементе ЛистВью я не понимаю


    10 октября 2013 г. 13:39
  • Хм, забавно.

    Я создал пустой проект. В разметку главной формы добавил кнопку, в проект добавил ваши классы MainViewModel и DelegateCommand, убрал работу с фидами и пользователями, создал ViewModel и положил в DataContext главной формы... Все работает. MessageBox показывается. Правда я убрал и вызов вашего метода Main... Попробуйте сделать вот так:

    public MainViewModel()
    {
        LikeCommand = new DelegateCommand(LikeAction);
        MainStarter();
    }
    
    private void MainStarter()
    {
        Main();
    }
    
    private async void Main()
    {
        if (await Authorization.Authorize(false))
        {
            await Friends.DownloadFriendsAsync(); // Скачали друзей из вконтакта
            ContactsOnline(); // Вывели друзей-онлайн на экран
            FeedsDownloadAsync(); // Вывели список но
        }
    }

    10 октября 2013 г. 13:53
    Отвечающий
  • Посмотрите в Output, нет ли Binding error. Так же, по ксамлу видно, что кнопка лежит не в дата темплейте листвью, это верно? Просто если она будет лежать в дататемплейте у листвью, то у кнопки будет Датаконтекст этого же листвью, соответственно она ничего кроме коллекции которую вы скормили листвью видеть не будет. Вам нужно будет после Binding LikeCommandдописать Souce={StaticResource ViewModel}
    • Помечено в качестве ответа evgeniy.polonskiy 10 октября 2013 г. 14:07
    10 октября 2013 г. 13:54
  • Ха, смешная каруселька =))

    10 октября 2013 г. 14:07
  • Да, кнопка лежит в отдельном DataTemplate.

    Ваш вариант прекрасно работает.

    Спасибо большое) Вы на все мои вопросы отвечаете))

    10 октября 2013 г. 14:08
  • Пожалуйста, рады помочь.
    • Изменено Oleg Kurzov 10 октября 2013 г. 14:11
    10 октября 2013 г. 14:09