Проверьте ckeckbox в wpf, нажав на весь элемент - PullRequest
1 голос
/ 17 апреля 2019

У моего клиента проблема с размером CheckBox внутри ListBox.Я согласен, это маленький и не так легко проверить время от времени.

Я пытался найти способ увеличить CheckBox, но обнаружил, что это сложно (и потребует использования Blend, который я не хочу использовать).

Что я хочу сделать, так это проверить CheckBox при нажатии на весь элемент.

[] некоторый текст

В этом примере - на «некотором тексте» или внутри элемента где угодно.Прямо сейчас я должен щелкнуть внутри CheckBox, чтобы проверить.

Я генерирую CheckBoxes динамически.

Мои xamls этого элемента управления выглядят так:

     <ListBox Name="restoredDBsListBox" ItemsSource="{Binding ProperlyRestoredDatabases}"  Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="170" Margin="34,160,0,0" VerticalAlignment="Top" Width="276" SelectionMode="Extended">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" >
                    <CheckBox Name="check" IsChecked="{Binding IsChecked, Mode=TwoWay}" Margin="3" VerticalAlignment="Center"/>
                    <ContentPresenter Content="{Binding Value}" Margin="1"/>                       
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

и моя ViewModel:

    /// <summary>
    /// Defines the _properlyRestoredDatabases
    /// </summary>
    private CheckableObservableCollection<string> _properlyRestoredDatabases;

    /// <summary>
    /// Gets or sets the ProperlyRestoredDatabases
    /// </summary>
    public CheckableObservableCollection<string> ProperlyRestoredDatabases
    {
        get { return _properlyRestoredDatabases; }
        set
        {
            _properlyRestoredDatabases = value;
            OnPropertyChanged("ProperlyRestoredDatabases");
        }
    }

CheckableObservableCollection class:

  public class CheckableObservableCollection<T> : ObservableCollection<CheckedWrapper<T>>
{
    private ListCollectionView _selected;

    public CheckableObservableCollection()
    {
        _selected = new ListCollectionView(this);
        _selected.Filter = delegate (object checkObject) {
            return ((CheckedWrapper<T>)checkObject).IsChecked;
        };
    }

    public void Add(T item)
    {
        this.Add(new CheckedWrapper<T>(this) { Value = item });
    }

    public ICollectionView CheckedItems
    {
        get { return _selected; }
    }

    internal void Refresh()
    {
        _selected.Refresh();
    }
}

иCheckedWrapper

 public class CheckedWrapper<T> : INotifyPropertyChanged
{
    private readonly CheckableObservableCollection<T> _parent;

    public CheckedWrapper(CheckableObservableCollection<T> parent)
    {
        _parent = parent;
    }

    private T _value;

    public T Value
    {
        get { return _value; }
        set
        {
            _value = value;
            OnPropertyChanged("Value");
        }
    }

    private bool _isChecked;

    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            _isChecked = value;
            CheckChanged();
            OnPropertyChanged("IsChecked");
        }
    }

    private void CheckChanged()
    {
        _parent.Refresh();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler pceh = PropertyChanged;
        if (pceh != null)
        {
            pceh(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

1 Ответ

1 голос
/ 17 апреля 2019

CheckBox имеет свойство Content, поэтому нет необходимости использовать отдельный ContentPresenter. Если вы также добавите ItemContainerStyle, растягивающий контейнер ListBoxItem по горизонтали, вы сможете установить или снять флажок CheckBox, щелкнув в любом месте строки:

<ListBox Name="restoredDBsListBox" ItemsSource="{Binding ProperlyRestoredDatabases}"  Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="170" Margin="34,160,0,0" VerticalAlignment="Top" Width="276" SelectionMode="Extended">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Name="check" IsChecked="{Binding IsChecked, Mode=TwoWay}"
                    Content="{Binding Value}"
                    Margin="3" 
                    VerticalAlignment="Center"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...