Итерация по определенной строке в сетке WPF - PullRequest
0 голосов
/ 03 января 2019

Я хочу выполнить итерацию определенного Row в Grid из Wpf и получить UI Element внутри каждой ячейки этой строки.Я много искал, но не нашел никакого решения для этого!Элемент пользовательского интерфейса имеет тип TextBlock.

Объяснение
Как вы можете видеть на прикрепленном изображении.У меня есть Grid, у которого есть Rows и Columns.Я хочу перебрать Row 0 и сравнить TextBlock.Text внутри каждого cell из Row 0 с некоторыми text.Как это сделать ?

Image here

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Для удержания View и ViewModel разделенных и не использовать CodeBehind для логики, я бы рекомендовал использовать DataGrid и Binding для поиска, поэтому View будет выглядеть так:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" Grid.Row="0" Grid.Column="0"></TextBox>
    <TextBlock Text="{Binding SearchResult}" Grid.Row="0" Grid.Column="1"></TextBlock>

    <DataGrid ItemsSource="{Binding Entries}" Grid.Row="1" Grid.ColumnSpan="2">
    </DataGrid>
</Grid>

Так что SearchText - это то, что нужно искатьи SearchResult является результатом.Оба связаны с ViewModel.А модель Connected View содержит DoSearchBay () для обновления поля SearchResult значением текущего SearchText, код должен быть таким:

public class ViewModel: INotifyPropertyChanged
{
    private String _searchText = "Bay?";
    private String _searchResult = "N/A";

    public ObservableCollection<MyDataObject> Entries { get; set; }

    public string SearchText
    {
        get => _searchText;
        set
        {
            if (value == _searchText) return;
            _searchText = value;
            DoSearchBay();
            OnPropertyChanged();
        }
    }

    private void DoSearchBay()
    {
        var sel = Entries.Select((dm, index) => new { index, dm.Bay}).FirstOrDefault(obj => obj.Bay.Equals(_searchText, StringComparison.OrdinalIgnoreCase)) ;
        if (sel != null)
        {
            SearchResult = "Found in row " + sel.index;
        }
        else
        {
            SearchResult = "N/A";
        }
    }

    public string SearchResult
    {
        get => _searchResult;
        set
        {
            if (value == _searchResult) return;
            _searchResult = value;
            OnPropertyChanged();
        }
    }


    public ViewModel()
    {
        //Create Fake values
        Entries = new ObservableCollection<MyDataObject>();
        Entries.Add(new MyDataObject() {Bay = "Bay1", Am9 = "value1-1", Am10 = "value1-2", Am11 = "value1-3" });
        Entries.Add(new MyDataObject() { Bay = "Bay2", Am9 = "value2-1", Am10 = "value2-2", Am11 = "value2-3" });
        Entries.Add(new MyDataObject() { Bay = "Bay3", Am9 = "value3-1", Am10 = "value1-2", Am11 = "value3-3" });
    }

    // ToDo Implement INotifyPropertyChanged...
}

Модель, содержащая данные, которые выглядят как:

public class MyDataObject
{
    public String Bay { get; set; }
    public String Am9 { get; set; }
    public String Am10 { get; set; }
    public String Am11 { get; set; }
}
0 голосов
/ 03 января 2019

Сначала вы можете получить коллекцию Grid's Children, затем вы можете проверить для каждого элемента, в какой строке он расположен:

foreach (var element in grid1.Children) {
    if (grid1.GetRow(element) == 0) {
        //now you get all the UIElements in the first row
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...