UWP ColorPickerButton в ячейке сетки данных UWP не будет выбран

#c# #uwp #datagrid #color-picker

Вопрос:

Я использую DataGrid и ColorPickerButton отсюда

 xmlns:toolkit="using:Microsoft.Toolkit.Uwp.UI.Controls
 

Когда я нажимаю на ColorPickerButton него, он остается открытым, и свойство цвета не меняется.

введите описание изображения здесь

Как это исправить? Спасибо!

XAML

  <toolkit:DataGrid    
                    x:Name="dataGridLayers"
                    Margin="0,0,0,0"
                    VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
                    HorizontalScrollBarVisibility="Visible"
                    VerticalScrollBarVisibility="Visible"
                    AlternatingRowBackground="Transparent" 
                    AreRowDetailsFrozen="False"
                    AreRowGroupHeadersFrozen="True"
                    AutoGenerateColumns="False"
                    CanUserSortColumns="False"
                    CanUserReorderColumns="True"
                    RowGroupHeaderPropertyNameAlternative=""
                    CanUserResizeColumns="True"
                    ColumnHeaderHeight="32"
                    MaxColumnWidth="400"
                    FrozenColumnCount="0"
                    GridLinesVisibility="None"
                    HeadersVisibility="Column"
                    IsReadOnly="False" 
                    Height="400"
                    RowDetailsVisibilityMode="Collapsed"
                    SelectionMode="Single">
                                <toolkit:DataGrid.Columns>
                                    <toolkit:DataGridTextColumn Header="Name" Binding="{Binding LayerName}"  Tag="LayerName" IsReadOnly="True" />
                                    <toolkit:DataGridCheckBoxColumn IsThreeState="False"  Header="Включить в карту" Binding="{Binding LayerVisibility,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Tag="LayerVisibility"  />
                                    <toolkit:DataGridTextColumn Header="Stroke" Binding="{Binding LayerStroke, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"   Tag="LayerStroke" />
                                    <toolkit:DataGridTemplateColumn  Header="Color"  Tag="LayerColor">
                                        <toolkit:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate >
                                                <toolkit:ColorPickerButton SelectedColor="{Binding LayerColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                                            </DataTemplate>
                                        </toolkit:DataGridTemplateColumn.CellTemplate>
                                    </toolkit:DataGridTemplateColumn>
                                </toolkit:DataGrid.Columns>
                            </toolkit:DataGrid>
                     
 

C#

  public abstract class EtherMapLayerBase : INotifyPropertyChanged
    {
        public Windows.UI.Color _layerColor { get; set; }
        public Windows.UI.Color LayerColor
        {
            get
            {
                return _layerColor;
            }

            set
            {
                if (_layerColor != value)
                {
                    _layerColor = value;
                    OnPropertyChanged();
                }
            }
        }


        public int _layerStroke { get; set; }
        public int LayerStroke
        {
            get
            {
                return _layerStroke;
            }

            set
            {
                if (_layerStroke != value)
                {
                    _layerStroke = value;
                    OnPropertyChanged();
                }
            }
        }


        public string _layerName { get; set; }
        public string LayerName
        {
            get
            {
                return _layerName;
            }

            set
            {
                if (_layerName != value)
                {
                    _layerName = value;
                    OnPropertyChanged();
                }
            }
        }


        public bool _layerVisibility { get; set; }
        public bool LayerVisibility
        {
            get
            {
                return _layerVisibility;
            }

            set
            {
                if (_layerVisibility != value)
                {
                    _layerVisibility = value;
                    OnPropertyChanged();
                }
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
        {
            if (object.Equals(storage, value))
            {
                return false;
            }
            else
            {
                storage = value;
                OnPropertyChanged(propertyName);
                return true;
            }
        }
    }

    public class EtherMapLayerView : EtherMapLayerBase
    {
        public EtherMapLayerView()
        {
            LayerStroke = 1;
            LayerColor = Colors.Black; // using Windows.UI;
            LayerVisibility = true;
        }
    }
 

Обновление № 1
Это похоже на ошибку…

Поэтому, когда вы выбираете цвет на первой вкладке, ничего не происходит, но если вы сделаете то же самое на других вкладках, это сработает, и цвет может быть успешно выбран.

Ответ №1:

Когда я нажимаю на кнопку выбора цвета, она остается открытой, и свойство цвета не меняется.

Проблема в том , что вы установили базовый цвет как Black LayerColor = Colors.Black , и это приведет к невозможности выбора цветового круга.

Пожалуйста , попробуйте установить цвет по умолчанию как Transparent , и он будет работать так, как ожидалось.

 LayerColor = Colors.Transparent
 

Комментарии:

1. Спасибо тебе большое! Эй, у меня все еще есть похожая проблема toolkit:DataGridCheckBoxColumn . Чтобы снять этот флажок, мне нужно нажать 3 раза. Ему нужен дополнительный щелчок, чтобы каким-то образом выбрать элемент управления. Не могли бы вы мне помочь, пожалуйста?

2. Конечно, примерный способ привязать флажок к свойству bool и использовать дополнительную кнопку, чтобы установить это свойство bool как ложное.

3. Спасибо, чувак! Я сделал все, как ты сказал: <controls:DataGridTemplateColumn.CellTemplate> <DataTemplate><StackPanel Orientation="Horizontal"><CheckBox IsChecked="{Binding MyCheckField}" />