Свойство SelectedItem не обновляется - PullRequest
0 голосов
/ 16 марта 2012

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

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

XAML MarkUp:

        <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");
        }
    }

1 Ответ

0 голосов
/ 16 марта 2012

Может ли быть так, что, поскольку вы не подписаны на событие 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;
}
...