Как запустить событие из кнопки внутри сетки данных в Silverlight и MVVM - PullRequest
5 голосов
/ 09 декабря 2010

У меня есть кнопка в первом столбце в сетке данных. Я использую MVVM и пытаюсь привязать команду к команде в ViewModel, но когда я нажимаю кнопку в каждой строке, она не работает (она не вызывает Command в ViewModel), но если я перемещаю эту кнопку из сетки данных, она работает правильно.

Как вызвать событие из кнопки внутри сетки данных в MVVM?

Обновление 1:

Код XAML:

<datagrid:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" 
                        VerticalAlignment="Center">
            <Button x:Name="button" Content="View" Margin="5" DataContext="{StaticResource XDataContext}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <i:InvokeCommandAction Command="{Binding ViewOrganizationCommand}"
                                                CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" />
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </StackPanel>
    </DataTemplate>
</datagrid:DataGridTemplateColumn.CellTemplate>

Код ViewModel:

public ViewModelCommand ViewOrganizationCommand { get; set; }

Ответы [ 6 ]

1 голос
/ 28 ноября 2012

Эта статья предлагает решение с DataContextProxy. Применение этого решения позволяет написать код кнопки, подобный ответу Остина Лэмба.

1 голос
/ 31 декабря 2010

Вместо использования EventTrigger, почему бы просто не связать напрямую с Button.Command, например?

<Button 
    ...other properties...
    Command="{Binding ViewOrganizationsCommand}"
    CommandParameter="{Binding}"/>

Это свяжет команду и установит для CommandParameter значение DataContext для Button, которое предположительнохорошая вещь для привязки параметра.Если это не так, просто привяжите CommandParameter к чему-то еще, что поможет вам однозначно идентифицировать конкретную строку, по которой щелкают.

0 голосов
/ 19 апреля 2011

Я решил эту проблему, используя поведение EventToCommand в MVVMLight Toolkit

0 голосов
/ 23 февраля 2011

Каждая строка DataGrid имеет свой DataContext, установленный для этого объекта.Если ItemSource для сетки представляет собой ObservableCollection, DataContext каждой строки является объектом Organization.

Есть два способа справиться с этим.

  1. Создание обертки или расширения ViewModelэто разоблачает команду.Затем команда должна сработать. Вот некоторый псевдо-код.

    public class OrganizationExtensionViewModel
    {
        <summary>
        /// Private currentOrginization property.
        /// </summary>          
        private Organization currentOrginization;
    
        public Organization CurrentOrganization
        {
            get
            {
                return this.currentOrginization;
            }
    
            set
            {
                if (this.currentOrginization != value)
                {
                    this.currentOrginization = value;
                    this.RaisePropertyChanged("CurrentOrganization");
                }
            }
        }
    
        public ViewModelCommand ViewOrganizationCommand { get; set; }
        public OrganizationExtensionViewModel(Organization o)
        {
            this.CurrentOrganization = o;
            this.ViewOrganizationCommand = new ViewModelCommand(this.ViewOrgnaizationClicked);
        }
    }
    
  2. Определите ViewModel в xaml как StaticResource и обозначьте его как путь привязки.

... В сетке

<Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand, Source={StaticResource viewModel}}" />
0 голосов
/ 02 января 2011

попробуйте установить свой DataContext Button в StackPanel и установить Command и CommandParameter для кнопки.

<datagrid:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" 
                        VerticalAlignment="Center" DataContext="{StaticResource XDataContext}">
            <Button x:Name="button" Content="View" Margin="5" Command="{Binding ViewOrganizationCommand}" CommandParameter="{Binding ElementName=dtgOrganizations, Path=SelectedItem}" >
            </Button>
        </StackPanel>
    </DataTemplate>
</datagrid:DataGridTemplateColumn.CellTemplate>
0 голосов
/ 01 января 2011

Привязка команд с использованием триггера событий выглядит нормально (так я всегда это делаю), Но я подозреваю, что ваша команда никогда не назначается (вы используете автоматические свойства) Я обычно делаю это так:

private ViewModelCommand viewOrganizationCommand;

public ViewModelCommand ViewOrganizationCommand 
      {
         get
         {
            if (viewOrganizationCommand  == null)
               viewOrganizationCommand = new ViewModelCommand(Action, CanDoIt);
            return viewOrganizationCommand;
         }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...