WPF - привязка в шаблоне данных к ViewModel, а не к отдельной записи - PullRequest
2 голосов
/ 28 декабря 2011

У меня есть пользовательский элемент управления WPF, содержащий telerik RadGridView. Контекст данных элемента управления устанавливается на экземпляр класса MyViewModel. Класс MyViewModel имеет свойство myRecords типа ObservableCollection. RadGridView связан таким образом:

ItemsSource="{Binding myRecords}"

В RadGridView я определяю ряд столбцов, которые содержат шаблоны данных, которые привязываются к свойствам MyRecords. Это работает нормально.

Я добавил столбец, содержащий кнопку удаления. Или, скорее, содержит DataTemplate, который содержит кнопку с надписью «удалить». Это связано с командой, определенной в записи:

<telerik:GridViewColumn.CellTemplate>
    <DataTemplate>
        <Button 
                Command="{Binding deleteCommand}"
                CommandParameter="{Binding}">
            <Label>Delete</Label>
        </Button>
    </DataTemplate>
</telerik:GridViewColumn.CellTemplate>

И это отлично работает. Свойство ICommand, которое я определил в MyRecord, выполняется.

Но вот в чем дело - я не хочу, чтобы этот код. Я не хочу запускать метод в MyRecord, я хочу запустить метод в MyViewModel, передавая соответствующий MyRecord в качестве аргумента. Элемент CommandParameter = "{Binding}" выше передает соответствующий MyRecord, так что с этой частью все в порядке. Но я не смог выяснить, как связать команду кнопки с ICommand объекта MyViewModel вместо MyRecord.

Я играл с RelativeSource и AncestorType и ничего не получил.

Помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Один из возможных подходов - использовать ViewModel для вашей записи, которая обернет вашу запись модели, а также будет содержать ссылку на ICommand. При инициализации каждого recordViewModel по одному для каждой записи

recordViewModel.deleteCommand = myViewModel.deleteCommand;

где recordViewModel и myViewModel являются экземплярами соответствующих классов.

Таким образом, при нажатии кнопки «Удалить» в строке будет выполнена команда deleteCommand в родительском DataContext.

Обновление: я нашел потенциальное альтернативное решение, при котором вы привязываетесь к другому элементу, чтобы вы не были ограничены контекстом данных вашего элемента и вместо этого использовали контекст данных любого указанного вами элемента.

Command="{Binding DataContext.MyCommand, ElementName=LayoutRoot}"

ссылка: http://blog.kevindockx.com/post/MVVM-challenge-binding-to-a-command-from-inside-an-ItemsControl-DataTemplate.aspx

0 голосов
/ 17 января 2012

Вы можете сделать это, используя FindAncestor, например: {Binding DataContext.DeleteCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}.

Я думаю, что это будет лучшее решение.

...