ListBox.SelectionChanged не срабатывает - PullRequest
0 голосов
/ 07 марта 2012

У меня есть ListBox, каждый элемент имеет TextBlock и кнопку. Кнопка имеет команду. Проблема в том, что выбранный элемент списка не меняется, когда я нажимаю кнопку. (Я полагаю, событие не изменено). когда я нажимаю на текстовый блок, он работает нормально.

<ListBox ItemsSource="{Binding FavList}" SelectedItem="{Binding SelectedFav,Mode=TwoWay}">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <TextBlock Text="{Binding Name}"/>
                                    <Button Content="+" Command="{Binding Source={StaticResource ViewModel},Path=AddToFavCommand}" Margin="120,0,0,0"/>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

Связанные части моей модели представления (я не думаю, что у нее есть какие-либо проблемы):

private Products _selectedFav;
        public Products SelectedFav
        {
            get
            {
                return _selectedFav;
            }
            set
            {
                if (value != _selectedFav)
                {
                    _selectedFav = value;
                    NotifyPropertyChanged("SelectedFav");
                }
            }
        }

public DelegateCommand AddToFavCommand { get; set; }
AddToFavCommand = new DelegateCommand(addtofav);

private void addtofav(object parameter){
}

Так что мне нужно изменить выбранный пункт перед выполнением команды. Как я могу это сделать?

1 Ответ

1 голос
/ 07 марта 2012

Мое предложение было бы не использовать ListBox здесь.Используйте ListBox только тогда, когда вам нужно выбрать элемент.Вместо этого рассмотрим ItemsControl.

Следующая проблема, которую вы имеете, касается выбранного элемента.Вы можете сделать это, привязав CommandParameter к текущему элементу следующим образом:

CommandParameter="{Binding}"

Затем вам нужно будет изменить вашу Команду, чтобы принять параметр.С DelegateCommand похоже, что вы, возможно, используете Prism (или использовали свой собственный DelegateCommand), и я не уверен, что вы можете настроить его для принятия параметра.Я знаю, что для MVVM Light (и RelayCommand) это выглядит так:

public RelayCommand<Products> AddToFavCommand { get; private set;}

тогда, где вы настраиваете свои команды:

AddToFavCommand = new RelayCommand<Products>((p)=>AddToFav(p));

или, проще, используя методгруппа:

AddToFavCommand = new RelayCommand<Products>(AddToFav);

и

private void AddToFav(Products p)
{

     //do stuff
}
...