Свойство SelectedItem не обновляется

Относительно новичок в C # и MVVM, но я делаю приложение WP7 с помощью MVVM Light Toolkit. У меня проблема с двухсторонней привязкой свойства в ListBox. У меня есть ObservableCollection клиентов, и я пытаюсь выбрать отдельного клиента (при нажатии на него я перехожу к новой модели просмотра).

Когда я нажимаю на выбранный элемент, он должен обновить свойство SelectedItem и установить значение, соответствующее клику, по которому кликнул. Однако при нажатии он даже не попадает в сеттер (я пометил точку останова знаком *). Кто-нибудь знает, где я ошибся, или есть лучшее решение? Я трачу это место часами!

Разметка XAML:

        <ListBox SelectedItem="{Binding SelectedItem, Mode=TwoWay}" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Margin="0,0,0,17" Width="432">
                    <Button CommandParameter="{Binding}">
                        <helper:BindingHelper.Binding>
                            <helper:RelativeSourceBinding Path="ShowClientCommand" TargetProperty="Command"
                                    RelativeMode="ParentDataContext" />
                        </helper:BindingHelper.Binding>
                        <Button.Template>
                            <ControlTemplate>
                                <TextBlock Text="{Binding Name}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
                            </ControlTemplate>
                        </Button.Template>
                    </Button>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Свойства ViewModel:

    public ObservableCollection<Client> ClientList
    {
        get 
        {
            return _clientList;
        }
        set 
        {
            _clientList = value;
            RaisePropertyChanged("ClientList");
        }
    }

    public Client SelectedItem
    {
        get
        {
            return _selectedItem;
        }
        set
        {
         *   _selectedItem = value;
            RaisePropertyChanged("SelectedItem");
        }
    }

person renegade442    schedule 15.03.2012    source источник
comment
Почему вы используете кнопку внутри шаблона ListBox? Я не уверен, но, вероятно, SelectedItem не возникает, потому что сначала происходит событие нажатия кнопки!   -  person Pedro Lamas    schedule 16.03.2012
comment
Следовал руководству по спискам в шаблоне MVVM с использованием кнопок, которое привело меня к этому. Вы действительно правы!   -  person renegade442    schedule 16.03.2012


Ответы (1)


Может быть, поскольку вы не подписаны на событие selection_changed, оно не меняет свойство?

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

Подпишите свой список для события SelectionChanged следующим образом:

<ListBox SelectionChanged="FirstListBox_SelectionChanged" ItemsSource="{Binding ClientList, Mode=TwoWay}" x:Name="FirstListBox" Margin="0,0,-12,0" ScrollViewer.VerticalScrollBarVisibility="Auto">

Затем в соответствующем файле .cs создайте обработчик, который выглядит следующим образом:

private void FirstListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // If selected index is -1 (no selection) do nothing
    if (FirstListBox.SelectedIndex == -1)
        return;

    // get the client that's selected
    Client client = (Client) FirstListBox.selectedItem;

    //... do stuff with the client ....

    // reset the index (note this will fire this event again, but
    // it'll automatically return because of the first line
    FirstListBox.SelectedIndex = -1;
}
person Nico    schedule 15.03.2012
comment
Хм, это работает, когда я убираю реализованную мной логику кнопок и вместо этого использую selectionChanged. Мне пришлось отказаться от шаблона MVVM для этого решения, но я буду искать способ включить его и событие SelectionChanged. Спасибо за ответ - я снова в пути. :) - person renegade442; 16.03.2012
comment
Да, код, который вы опубликовали, выглядел так, как будто он должен работать, и я недостаточно знал о шаблоне MVVM, чтобы помочь в этом, поэтому я просто рассказал вам то, что я знаю, работает. Но я рада, что ты катишься :) - person Nico; 16.03.2012