Привязка IsSelectedProperty ListBox в WPF не работает.Нужна помощь - PullRequest
0 голосов
/ 14 июля 2010

Я пытаюсь сделать что-то, что должно быть просто умопомрачительным, однако я не могу заставить его работать. Я отображаю список элементов в списке. Я добавил флажки в список, чтобы пользователь мог выбрать несколько элементов. Однако даже если объект в списке, привязанный к ListBox, имеет свойство IsSelected, он не привязывается. Я мог бы использовать некоторую помощь, так как это сводит меня с ума.

<Style x:Key="CheckBoxListStyle" TargetType="{x:Type ListBox}">
    <Setter Property="SelectionMode" Value="Multiple"></Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Margin" Value="2"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBoxItem}">
                            <CheckBox Focusable="False"
                                        IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
                                <ContentPresenter></ContentPresenter>
                            </CheckBox>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>

<ListBox 
                        Style="{StaticResource CheckBoxListStyle}"
                        IsEnabled="{Binding Path=SpecificClients.Value, Mode=OneWay}"
                        ItemsSource="{Binding Path=SelectedClients}"
                        VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling"
                        ScrollViewer.VerticalScrollBarVisibility="Auto"
                        MaxHeight="95">
                </ListBox>

В View Model у меня есть следующее:

public IEnumerable<SelectedClientVM> SelectedClients
....
public class SelectedClientVM
    {
        public bool IsSelected { get; set; }
        public Client Client { get; set; }
        public override string ToString()
        {
            return Client.SearchText;
        }
    }

Ответы [ 2 ]

1 голос
/ 14 июля 2010

Я думаю, что то, что вы хотите, может быть лучше достигнуто путем определения DataTemplate, который будет использоваться для каждого элемента в ListBox. DataTemplate указывает, как вы хотите, чтобы отдельный фрагмент данных (Client в вашем случае) отображался в ListBox.

Вот мой XAML для простого шаблона данных.

    <DataTemplate x:Key="clientTemplate" DataType="{x:Type local:Client}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <CheckBox IsChecked="{Binding IsSelected}" />
            <TextBlock Grid.Column="1" Text="{Binding Name}" Margin="5,0,0,0" />
        </Grid>
    </DataTemplate>

Вот как я ссылался на это в объявлении ListBox:

<ListBox ItemsSource="{Binding SelectedClients}"
         VirtualizingStackPanel.IsVirtualizing="True"
         ItemTemplate="{StaticResource clientTemplate}" />

Во-вторых, к ответу Гранта вы должны быть уверены, что ваш класс Client реализует INotifyPropertyChanged. Кроме того, вы захотите представить свой список клиентов, используя коллекцию, которая поддерживает уведомления об изменениях. Я обычно использую ObservableCollection<T>.

0 голосов
/ 14 июля 2010

Возможно, это не единственная проблема, но если вы хотите, чтобы представление обновлялось на основе вашей ViewModel, вам придется реализовать INotifyPropertyChanged (или что-то, что выполняет аналогичную работу) в свойстве IsSelected.

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