Как вы связываете Button Button с методом member? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть ListView в моей реализации MVFM WPF, он имеет шаблон данных с кнопкой внутри. ListView привязан к коллекции сложных объектов в ViewModel.

 <ListView ItemsSource="{Binding Path=ComplexObjects}"
          SelectedItem="{Binding Path=SelectedObject}"
          Width="Auto">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="My Property">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Margin="6,2,6,2">
                            <TextBlock Text="{Binding MyProperty}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
    </GridViewColumn>
            <GridViewColumn Header="First Name">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Margin="6,2,6,2">
                            <Button Command="{Binding ???}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
    </GridView>
</ListView.View>

Все текстовые поля связаны без проблем, но можно ли привязать команду кнопки к методу-члену ComplexObject? Если да, есть ли способ передать параметры?

У меня такое ощущение, что я, вероятно, просто уклоняюсь от использования ICommand.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 03 февраля 2012

Вы можете привязать ICommand к ViewModel, передав экземпляр, чтобы вызвать метод в качестве параметра. Затем ViewModel может вызвать соответствующий метод справа ComplexObject.

Например:

<DataTemplate>
    <StackPanel Margin="6,2,6,2">
        <Button Command="{Binding DoSomethingCommand, RelativeSource={RelativeSource AncestorType={x:Type ViewModelType}, Mode=FindAncestor}" CommandParameter="{Binding}"/>
    </StackPanel>
</DataTemplate>

Тогда модель представления может выглядеть так:

public ICommand DoSomethingCommand
{
    get { return new DelegateCommand<object>(DoSomething); }
}

private void DoSomething(object instance)
{
    var complexObject = instance as ComplexObject;
    if (complexObject != null)
        complexObject.SomeMethod();
}
2 голосов
/ 03 февраля 2012

Если вы действительно хотите сойти с ума, я полагаю, вы могли бы создать собственный элемент управления для кнопки со свойством зависимости, равным delegate, а затем связать со свойством, которое возвращает тот же тип delegate. А затем в своем пользовательском классе управления вы можете вызывать делегата при нажатии на него.


Всегда есть стандартная ICommand, если вы идете по этому пути, вот как ...

<Button Command={Binding CommandProperty} />

Используйте класс DelegateCommand Кента Бугаарта из его сообщения в блоге . Тогда ...

В классе вы привязаны к:

private ICommand _commandField;

public ICommand CommandProperty
{
  get
  {
    if (_commandField == null) _commandField = new DelegateCommand(CommandMethod);

    return _commandField;
  }
}

private void CommandMethod() 
{
  // do stuff...
}
0 голосов
/ 03 февраля 2012

Да для кнопки вам нужно будет использовать ICommand, установленный в вашем ComplexObject:

<Button Command="{Binding Path = CommandName}"/>

Если ваш метод находится в View Model, которая содержит имя коллекции ComplexObjects вашего элемента управления или окна Me и используйте что-то вроде этого:

<Button Command="{Binding ElementName=Me, Path=DataContext.CommandName}" />

Вы можете использовать щелчок или предварительный просмотр мыши вниз, но если вы хотите связать метод в XAML, вам все равно придется направить это событие в команду.Просто связать команду проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...