C# Привязка WPF Datagrid в xaml к массиву строк - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь привязать массив строк к столбцу Datagrid. У меня есть переменная типа int, но я хочу показать строковое значение. Итак, моя идея состоит в том, чтобы связать массив строк и использовать значение int в качестве индекса.

public class TestStep : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged([CallerMemberName] string propName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }

    public int Mode { get; set; }

    public string[] ModeName { get; set; } = { "name1", "name2" };
}

Итак, XAML, который я использую, это:

<DataGrid ItemsSource="{Binding TestStep , UpdateSourceTrigger=PropertyChanged}" 
        <DataGrid.Columns>
            <DataGridTextColumn Header="Mode ID" Binding="{Binding Mode }" />
            <DataGridTextColumn Header="Mode ID Name" Binding="{Binding ModeName[0]}" />
            <DataGridTextColumn Header="Mode ID Name" Binding="{Binding ModeName[Mode]}" />
        </DataGrid.Columns>
    </DataGrid>

Если я использую Binding="{Binding ModeName[0]}", я получаю правильное значение в таблице данных

Если я использую Binding="{Binding ModeName]Mode]}, я получаю ошибку привязки:

System. Windows. Ошибка данных: 40: Ошибка пути BindingExpression: '[ ] 'свойство не найдено в' объекте '' 'String []' (HashCode = 62367561) '. BindingExpression: путь = имя режима [{1}]; DataItem = 'TestStep' (HashCode = 4862753); целевой элемент - TextBlock (Name = ''); целевым свойством является 'Text' (type 'String')

Почему я не могу определить режим переменной в блоке []?

Спасибо

С уважением

1 Ответ

1 голос
/ 19 июня 2020

Почему я не могу разрешить переменную Mode в блоке []?

Путь привязки не является динамическим c. ModeName[Mode] в xaml интерпретируется как ModeName["Mode"] в c# (индексатор строк).

, но вы можете создать специальное свойство, используя как ModeName, так и Mode, и привязать к нему:

public class TestStep : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged([CallerMemberName] string propName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }

    public int Mode { get; set; }

    public string[] ModeName { get; set; } = { "name1", "name2" };

    public string CurrentModeName
    { 
         get { return ModeName[Mode]; }
         set { ModeName[Mode] = value; }
    }
}
<DataGrid ItemsSource="{Binding TestStep}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Mode ID" Binding="{Binding Mode}" />
        <DataGridTextColumn Header="Mode ID Name" Binding="{Binding ModeName[0]}" />
        <DataGridTextColumn Header="Mode ID Name" Binding="{Binding CurrentModeName}" />
    </DataGrid.Columns>
</DataGrid>
...