Необработанное исключение при нажатии кнопки

c# wpf xaml datagrid datatemplate

164 просмотра

3 ответа

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

Ошибка: необработанное исключение типа «Microsoft.CSharp.RuntimeBinder.RuntimeBinderException» возникло в System.Core.dll Дополнительная информация: «System.Data.DataRowView» не содержит определения для «Master»

Я получаю сообщение об ошибке на событии моей кнопки ... "d.Master".

private void ButtonClick(object sender, RoutedEventArgs e)
{
    Button button2 = (Button)e.OriginalSource;
    dynamic d = button2.DataContext;
    string filepath = d.Master;
    Process.Start(filepath); 
}

DataGrid:

<DataGrid x:Name="DataGrid1" HorizontalAlignment="Stretch" 
          Margin="650,197,449,0" VerticalAlignment="Stretch" 
          AutoGenerateColumns="True" AutoGeneratingColumn="DataGrid_AugoGeneratingColumn" ItemsSource="{Binding fileTable}">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Master" CellTemplate="{StaticResource DataTemplate2}"/>
    </DataGrid.Columns>
</DataGrid>

DataTemplate

<DataTemplate x:Key="DataTemplate2">
<Button Name="fileButton" Click="ButtonClick" Width="30" Height="30" BorderBrush="#FF707070" BorderThickness="1,1,0,1">
    <Button.Background>
        <ImageBrush ImageSource="C:\Images\PDFicon.png" Stretch="Uniform"/>
    </Button.Background>
</Button>
</DataTemplate>

Метод AutoGeneratingColumn:

private void DataGrid_AugoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.Column.Header.ToString() == "Master")
    {
        DataGridTemplateColumn templateColumn = new DataGridTemplateColumn    //create new template column
        CellTemplate = (DataTemplate) Resources["DataTemplate2"]
        e.Column = templateColumn; // Replace the auto-generated column with the templateColumn.
    }
    else
    {
        e.Column.Header = "Expired";
    }
}
Автор: ctalley5 Источник Размещён: 08.11.2019 10:54

Ответы (3)


0 плюса

Почему вы пытаетесь получить неопределенный Masterот кнопки DataContext? т.е. почему ошибка приходит.

Так как fileTableявляется источником вашей сетки данных, вам нужно иметь элемент Masterв fileTableтипе данных. Так как это еще не определено, ошибка будет произведена.

Лучшее решение состоит в том, чтобы иметь Masterсвойство в классе данных вашего ItemsSource и заполнить его соответствующим образом, чтобы во время нажатия кнопки вы могли получить к нему доступ через DataContext, как, как вы делаете сейчас.

Автор: ViVi Размещён: 20.08.2016 06:47

0 плюса

Спасибо всем, что указало мне в правильном направлении. Я думал, что DataContext указывает мне на сам столбец «Master» таблицы данных, который генерируется во время выполнения и не является истинным свойством. Я исправил свою проблему, идентифицировав выбранную ячейку.

        private void ButtonClick(object sender, RoutedEventArgs e)
    {
        //Get column Index of selected cell & set as variable
        int colIndex = BoundPivotGrid.CurrentCell.Column.DisplayIndex;
       DataRowView drv = (DataRowView)BoundPivotGrid.SelectedItem;
        String valueOfItem = drv[colIndex].ToString();

        if (valueOfItem == "-")
        {
            MessageBox.Show("No file");
        }
        else
        {
            Process.Start(valueOfItem);
        }
Автор: ctalley5 Размещён: 24.08.2016 03:02

-1 плюса

Проблема заключается в "string filepath = d.Master;". d имеет тип DataRowView, который не имеет свойства с именем Master. Измените dynamic на var, и он потерпит неудачу во время компиляции, а не во время выполнения

Автор: Carmine Размещён: 20.08.2016 05:24
Вопросы из категории :
32x32