Кнопка Команда не привязана к ViewModel в DatGrid - PullRequest
0 голосов
/ 17 июня 2011

У меня есть ViewModel, которая имеет ObservableCollection [Employee] EmpCol, теперь, когда ViewModel привязан к моему View, а EmpCol установлен как ItemSource пользовательского элемента управления. Этот пользовательский элемент управления генерирует стековые панели с сетками. Если в EmpCol есть 4 объекта, то будет 4 стековых панели с сетками внутри. Теперь в этих сетках у меня есть колонка кнопок. Теперь моя проблема в том, что я не могу связать команду этой кнопки в сетке данных с RelayCommand в классе Employee.

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

<Button x:Name="myButton"  Width="20" Height="15" HorizontalAlignment="Center"   VerticalAlignment="Center" Margin="5" >   
<i:Interaction.Triggers>
 <i:EventTrigger EventName="Click"> 
<cmd:EventToCommand Command="{Binding Source={StaticResource VMLocator}, Path=MyVM.Employee.MyButtonCommand}" PassEventArgsToCommand="False"/>  </i:EventTrigger>
</i:Interaction.Triggers>
</Button>

Теперь этот вышеуказанный подход работает, но в моем случае у меня не Employee, а коллекция Employee, поэтому, когда я даю путь привязки, как этот Path = MyVM.EmpCol.MyButtonCommand

Это не работает. Я много искал, но не мог найти решение. Так что любая помощь будет высоко оценена, чтобы решить мою проблему.

Спасибо, Maverick

Привязка команды происходит внутри строки DataGrid .

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Решение зависит от структуры вашего представления. Если у вас есть основное подробное представление, вы должны создать подструктуру, которая ожидает сотрудника ViewModel в качестве DataContext и связать его с выбранным в данный момент сотрудником. При этом вы получите правильный ViewModel для вашего представления.

Если вы переходите на новую страницу, самый простой подход может состоять в том, чтобы передать View id сотрудника, которого вы хотите показать, а затем в коде позади вызвать метод для вашей модели представления - которую вы можете получить из свойства DataContext. - загрузить нужного сотрудника из базы данных или службы.

Кроме того, вы можете хранить текущего сотрудника в доступной переменной приложения. Например. статическая переменная в вашем классе приложения, одноэлементный или статический класс, хранящийся в ваших ресурсах или в вашем ViewLocator (во всех случаях вам может потребоваться предоставить пустую ViewModel для сотрудника, когда ни один из сотрудников не выбран или препятствует открытию View).

Редактировать

Если набор ViewModels привязан к DataGrid и проблема связана с привязкой команды, это может быть возможным решением:

Поместите команду в ViewModel, которая содержит коллекцию (то есть свойство, которое связано с Источником Items в DataGrid). Затем выполните команду на этом высоком уровне ViewModel. Теперь вы можете использовать привязку RelativeSurce для доступа к этому более высокоуровневому ViewModel через родительское свойство DataContext DataGrid. Теперь вы можете привязать команду к своей кнопке и передать DataContext текущей строки в качестве параметра команды - команда, очевидно, должна ожидать этот параметр.

Редактировать 2 :

Forgot Silverlight не поддерживает все режимы RelativeSource, однако поддерживает привязку к названному элементу, поэтому должно работать следующее ...

Предположения:

  1. ViewModel более высокого уровня называется "EmployeeListViewModel"
  2. У него есть свойство Employees, содержащее список EmployeeViewModels
  3. DataContext элемента, содержащего DataGrid, установлен в EmployeeListViewModel

Код:

<DataGrid x:Name="dgEmployees" ItemsSource="{Binding Empoyees}" ...>
    ...
        <Button x:Name="myButton"  Width="20" Height="15" HorizontalAlignment="Center" 
                VerticalAlignment="Center" Margin="5" >   
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click"> 
                    <cmd:EventToCommand 
                        Command="{Binding ElementName=dgEmployees, Path=DataContext.MyButtonCommand}" 
                        CommandParameter="{Binding}" 
                        PassEventArgsToCommand="False"/>
            </i:Interaction.Triggers>
        </Button>
    ...
</DataGrid>
0 голосов
/ 26 января 2012

Самый простой способ - использовать команду Relay, например

public RelayCommand SearchCommand
 {
    get
    {
      return new RelayCommand(GetData);//GetDatais a method for your action on click event
    }
}

Подробности вы можете увидеть по следующей ссылке

http://codenicely.blogspot.com/2012/01/handling-button-click-event-in.html

...