WPF DataGrid Подсветка всех ячеек в столбце, соответствующих выбранной ячейке. - PullRequest
0 голосов
/ 07 июня 2018

Я заполняю ObservableCollection<> (также пытался List<>) пользовательским классом.Я связал коллекцию с DataGrid и определил столбцы.Теперь я хочу выбрать ячейку и выделить другие ячейки (в том же столбце, хотя данные в других столбцах никогда не будут совпадать), в которых есть одинаковая строка.

<Window.Resources>
    <local:CellHighlighterConverter x:Key="cellHighlighterConverter" />
    <CollectionViewSource x:Key="ScanCollectionViewSource" CollectionViewType="ListCollectionView" />
    <Style x:Key="CenterCell" TargetType="TextBlock">
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
    </Style>
    <Style x:Key="CellPad" TargetType="TextBlock">
        <Setter Property="Margin" Value="15,0,15,0" />
    </Style>
    <Style x:Key="CellHighlighterStyle" TargetType="TextBlock" >
        <Setter Property="Background" Value="{Binding IsMatching, NotifyOnSourceUpdated=True, Converter={StaticResource cellHighlighterConverter}}" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
    </Style>
</Window.Resources>
<Grid HorizontalAlignment="Center" >
    <DataGrid x:Name="scans" DataContext="{StaticResource ScanCollectionViewSource}" ItemsSource="{Binding}" AutoGenerateColumns="False" FontFamily="Lucida Console" Margin="10" MouseUp="scans_MouseUp" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Device Name" Binding="{Binding Hostname}" Width="125" />
            <DataGridTextColumn Header="Scan Date" Binding="{Binding ScanDate}" Width="75" ElementStyle="{StaticResource CenterCell}" />
            <DataGridTextColumn Header="GUID" Binding="{Binding GUID}" Width="300" ElementStyle="{StaticResource CenterCell}" />
            <DataGridTextColumn Header="MAC" Binding="{Binding MAC}" Width="105" ElementStyle="{StaticResource CellHighlighterStyle}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Код позади

private ObservableCollection<Scan> ReadFiles()
    {
        scanList = new List<Scan>();
        ...
        foreach(string file in files)
        {
            Scan newScan = new Scan();
            ...fill newScan with data
            scanList.Add(newScan);
        }
        scanList = scanList.OrderBy(x => x.Hostname).ThenByDescending(x => x.ScanDate).ToList();
        scanCollection = new ObservableCollection<Scan>(scanList);
        return scanCollection;        
   }

Способы, которыми я пытался добиться этого.Добавил свойство в класс, затем при наведении мыши установите это свойство, если данные совпадают (это работает), а затем используйте конвертер, чтобы установить фон на основе этих данных.Либо сетка не обновляется, либо что-то не так.Я на правильном пути или есть лучший способ?

private void scans_MouseUp(object sender, MouseButtonEventArgs e)
    {
        string selMAC = ((Scan)((DataGrid)sender).SelectedValue).MAC;
        foreach (Scan scan in scanList)//((DataGrid)sender).Items.OfType<Scan>().ToList() )
        {
            // compare values
            if (scan.MAC == selMAC)
            {
                scan.IsMatch = true;
            } else
            {
                scan.IsMatch = false;
            }
            //scans.Items.Refresh();
        }
    }
}

public class CellHighlighterConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if( (Boolean)value )
        {
            return new SolidColorBrush(Colors.Green);
        }
        return SystemColors.AppWorkspaceColor;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


public class Scan
{
    public Scan()
    {
        this.IsMatch = false;
    }

    public string Hostname { get; set; }
    public string ScanDate { get; set; }
    public string GUID { get; set; }
    public string MAC { get; set; }
    public bool IsMatch { get; set; }
}

1 Ответ

0 голосов
/ 07 июня 2018

Scan должен реализовывать интерфейс INotifyPropertyChanged и повышать уведомление для свойства IsMatch:

private bool _IsMatch;
public bool IsMatch 
{
    get { return _IsMatch; }
    set 
    { 
         if (_IsMatch == value) return;
         _IsMatch = value;
         OnPropertyChanged("IsMatch");
    }
}

без такого уведомления. Метод преобразования не запускается, даже если вы измените IsMatch.

другие вещи, которые я бы исправил:

Convert метод должен возвращать Brush, а не Color

{
    return (bool)value ? Brushes.Green : SystemColors.AppWorkspaceBrush;
}

использовать событие SelectionChanged вместо MouseUp.MouseUp может происходить в одной и той же ячейке несколько раз, не нужно каждый раз искать совпадения

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