Кнопка внутри представления списка WPF / сетки данных - PullRequest
3 голосов
/ 25 октября 2011

Я пытаюсь получить значение / идентификатор строки, по которой щелкнули.Если строка выбрана, это работает нормально.Но если я просто попытаюсь нажать на кнопку внутри, выбранный клиент будет нулевым.Как мне сделать параметры команды здесь.
Я пытался это увидеть ответы на следующие вопросы:

ListView и кнопки внутри ListView

WPF -Просмотр списка с помощью кнопки

Вот код:

<Grid>
    <ListView ItemsSource="{Binding Path=Customers}"
          SelectedItem="{Binding Path=SelectedCustomer}"
          Width="Auto">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="First Name">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Margin="6,2,6,2">
                                <TextBlock Text="{Binding Name}"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Address">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Margin="6,2,6,2">
                                <Button Content="Address" Command="{Binding Path=DataContext.RunCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"/>
                            </StackPanel>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

</Grid>

public class VM : ViewModelBase
{
    public RelayCommand RunCommand { get; private set; }
    private ObservableCollection<Customer> _Customers;
    public ObservableCollection<Customer> Customers
    {
        get { return _Customers; }
        set
        {
            if (value != _Customers)
            {
                _Customers = value;
                RaisePropertyChanged("Customers");
            }
        }
    }

    private Customer _SelectedCustomer;
    public Customer SelectedCustomer
    {
        get { return _SelectedCustomer; }
        set
        {
            if (value != _SelectedCustomer)
            {
                _SelectedCustomer = value;
                RaisePropertyChanged("SelectedCustomer");
            }
        }
    }

    public VM()
    {
        Customers = Customer.GetCustomers();
        RunCommand = new RelayCommand(OnRun);
    }

    private void OnRun()
    {
        Customer s = SelectedCustomer;
    }
}

в методе OnRun, выбранный клиент приходит как ноль.Я хочу, чтобы строка данных (клиент) здесь.Как мне это сделать?

Ответы [ 2 ]

9 голосов
/ 25 октября 2011

Три возможных решения, которые вы можете выбрать.

  • Передать объект текущей строки как CommandParameter.В этом случае вы немного измените метод OnRun.(рекомендуется)

<Button Content="Address" Command="{Binding Path=DataContext.RunCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter={Binding} />

Я думаю CommandParameter = {Binding} работает нормально, потому что DataContext каждой строки - это каждый объект Customer.

и метод OnRun необходимо изменить, чтобы получить параметр в качестве аргумента.


    private void OnRun(object o){
        if(!(o is Customer)) return;
        // Do something
    }

  • Или написать небольшой код с обработкой событий SelectionChanged.(не рекомендуется)

  • Или используйте EventToCommand в наборе инструментов MVVM-light.(не рекомендуется)

0 голосов
/ 11 ноября 2011

CommandParameter НЕ полностью поддерживает привязку данных.

http://connect.microsoft.com/VisualStudio/feedback/details/472932/wpf-commandparameter-binding-should-be-evaluated-before-command-binding

...