Комбинация флажков wpf listbox, действительно застряла - PullRequest
1 голос
/ 09 февраля 2011

Я пытаюсь связать флажок и просмотр списка вместе, а затем с помощью метода привязки установить путь к объекту, чтобы установить состояние флажка IsChecked в списке.

List<Test1> datas = new List<Test1>();

var data = new Test1 {Key = 1, Value = "Hello", IsSelected= true};
    datas.Add(data);
    data = new Test1 {Key = 2, Value = "Hello2", IsSelected= false};
    datas.Add(data);

Что мне нужно сделать, так это то, что если флажок установлен (IsSelected true), то мне нужно заполнить эти значения, а затем, когда я нажимаю и снимаю флажок в графическом интерфейсе, он мне также нужен, чтобы выбрать нужный элемент списка так что я могу добраться до свойства тега.

Этот код ниже не устанавливает флажок IsChecked.

<ListBox ItemsSource="{Binding}" Name="lstSwimLane" Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Mode=TwoWay}" 
                                          Checked="CheckBox_Checked" 
                                          Unchecked="CheckBox_Unchecked" />
                <TextBlock Text="{Binding Path=Value}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Что мне нужно изменить, чтобы установить флажок для значения в объекте? Я даже попробовал INotifyChange и т.д ...

Вот и объект.

public class Test1 : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _isChecked;

    public int Key { get; set; }
    public string Value { get; set; }

    public bool IsSelected
    {
        get { return _isChecked; } 
        set
        {
            if(_isChecked != value)
            {
                _isChecked = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

Я новичок во всем этом wpf, и я в тупике.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 09 февраля 2011

Вам нужно, чтобы это работало "в трех направлениях"?Поэтому установка любого из трех свойств

  • ListBoxItem.IsSelected
  • CheckBox.IsChecked
  • Item1.IsSelected

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

Обновление
Как указал Роберт Россни, гораздо лучшее решение дляэто для привязки

  • ListBoxItem.IsSelected к Item1.IsSelected
  • CheckBox.IsChecked к ListBoxItem.IsSelected

Обновлен Xaml

<ListBox ItemsSource="{Binding}"
         Name="lstSwimLane"
         SelectionMode="Multiple"
         Width="225" Height="125" SelectionChanged="lstSwimLane_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected"
                Value="{Binding Path=IsSelected,
                                Mode=TwoWay}"/>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Checked="CheckBox_Checked"
                          Unchecked="CheckBox_Unchecked"
                          IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}},
                                              Path=IsSelected}">
                </CheckBox>
                <TextBlock Text="{Binding Path=Value}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0 голосов
/ 09 марта 2011

В случае, если кому-то интересно, вот разметка для списка / combox. Он будет отображаться горизонтально.

Еще раз спасибо всем за помощь, я очень признателен.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
         ItemsSource="{Binding}" 
         Name="lstSwimLane" 
         SelectionMode="Multiple"
         Width="auto" 
         Height="auto"
         Background="Transparent"
         BorderThickness="0" 
         SelectionChanged="lstSwimLane_SelectionChanged" >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding Path=IsChecked, Mode=TwoWay}"/>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="3,3,3,3">
                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"
                          Checked="CheckBox_Checked" 
                          Unchecked="CheckBox_Unchecked" 
                          VerticalAlignment="Center" 
                          Margin="0,0,4,0" />
                <TextBlock Text="{Binding Value}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...