Jestem nowy w WPF i wszystkie te magiczne rzeczy wiążące i datatriggerów, więc proszę cię o trochę pomocy.

Mam prostą aplikację WPF pokazaną na zdjęciu poniżej. Wpisz opis obrazu tutaj

Chcę, aby moje treści datagridowi mogło odzwierciedlać warunki i filtr daty. Już pomyślałem, jak wiązać widoczność wierszy DataGrid w zależności od kodów zdarzeń i pola wyboru (START, STOP, Błąd). Ale nie mogę dowiedzieć się, jak wdrożyć filtrowanie daty. Chcę tylko: Po zaznaczeniu pola wyboru "Filtracje według daty", w moim datagridu tylko te wiersze pozostają widoczne, które mają datę w polu "Server Time" (myślę, że muszę przeanalizować w jakiś sposób z datetime) równą wybranej daty Combobox . Czy mogę osiągnąć tylko za pomocą XAML? Czy Enyone może mi pomóc? Oto XAML dla mojego DataGrid:

<DataGrid
        Grid.Row="1"
        Margin="5"
        AutoGenerateColumns="False"
        IsReadOnly="True"
        ItemsSource="{Binding LogEntries}"
        Style="{DynamicResource Helvetica}">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding event_code}" Value="1">
                        <Setter Property="Background" Value="LightGreen" />
                        <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=StartShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding event_code}" Value="2">
                        <Setter Property="Background" Value="LightGray" />
                        <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=StopShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding event_code}" Value="3">
                        <Setter Property="Background" Value="#FFEA816F" />
                        <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=ErrorShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" />
                    </DataTrigger>

                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding server_datetime, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Header="Server time" />
            <DataGridTextColumn Binding="{Binding user_datetime, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Header="Client time" />
            <DataGridTextColumn
                Width="*"
                Binding="{Binding log_entry}"
                Header="Entry" />

        </DataGrid.Columns>
0
rovnyart_ 16 luty 2017, 14:43

2 odpowiedzi

Najlepsza odpowiedź

Czy mogę osiągnąć tylko za pomocą XAML?

Nie, nie możesz dlatego, że Xaml jest znacznikiem Markup i nic więcej.

To, co Shold to, aby wiązać SelectedItem daty ComboBox do właściwości modelu Wyświetl DateTime i wiązać pole wyboru IsChecked "Filter przez" A właściwość bool Właściwość widoku i filtruje kolekcję źródła LogEntries, gdy ustawiono IsChecked właściwość źródłowa, np.:

public class ViewModel : INotifyPropertyChanged
{

    private bool _isChecked;
    public bool IsChecked
    {
        get { return _isChecked; }
        set
        {
            _isChecked = value;
            OnPropertyChanged();
            //filter collection:
            LogEntries = allLogEntries.Where(x => x.ServerTime == SelectedDate).ToList();
        }
    }

    private List<LogEntry> _logEntries;
    public List<LogEntry LogEntries
    {
        get { return _logEntries; }
        set
        {
            _logEntries = value;
            OnPropertyChanged();
        }
    }

    //...

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
1
mm8 16 luty 2017, 17:05

Wątpię, jest tylko sposób, aby zrobić to tylko w XAML, ponieważ filtrowanie wymaga określenia, jak filtrować (na przykład tworząc predykat).
Zalecam, aby uzyskać ICollectionView z Twoich Pleassource (które zakładam, jest obserwujCollection) i ustawić go właściwość filtra.
Sprawdź tę odpowiedź, aby uzyskać więcej informacji: Filtruj DataGrid w WPF

0
Community 23 maj 2017, 12:17