2016-10-18 1 views
0

Могу ли я использовать List<T> и List<Expression> для заполнения wpf datagrid?Могу ли я использовать список <T> и список <Expression> для заполнения wpf datagrid?

{ 
     var processes = Process.GetProcesses().ToList(); 
     PopulateDataGrid(processes, x => x.ProcessName, x => GetSafeFilename(x)); 
    } 
    private string GetSafeFilename(Process p) 
    { 
    try 
    { 
     return p.MainModule.FileName; 
    } 
    catch (Exception) 
    { 
     return ""; 
    } 
    } 

Идея заключается в том, что я хочу, чтобы иметь возможность передать список и Params список выражений для заполнения DataGrid. Я хочу показать список выражений в datagrid.

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

Я знаю, что я могу использовать анонимные типы, как:

var list = processes.Select(x => new {TagObject = x, ProcessName = x.ProcessName, Filename = GetSafeFilename(x)}).ToList(); 

Но тогда я должен убедиться, чтобы не добавить «TagObject» к сетке.

Любые идеи? Мне очень нравится идея синтаксиса:

PopulateDataGrid(processes, x => x.ProcessName, x => GetSafeFilename(x)); 

Но я не уверен, как это произошло.

+0

[? Как привязать список к элементу управления DataGridView] (http://stackoverflow.com/questions/479329/how-to-bind-a -liststring-to-a-datagridview-control) –

+0

[WPF: привязать DataGrid к списку ] (http://stackoverflow.com/questions/2872916/wpf-bind-datagrid-to-liststring) –

+0

Когда вы говорите о выражениях , вы имеете в виду [лямбда-выражения] (https://msdn.microsoft.com/en-us/library/bb397687.aspx?f=255&MSPPError=-2147217396), правильно? Поскольку WPF имеет свой собственный класс [Expression] (https://msdn.microsoft.com/en-us/library/system.windows.expression (v = vs.110) .aspx). –

ответ

1

Вы можете использовать анонимный тип и явным образом определить, какие столбцы вы хотите видеть в DataGrid:

<DataGrid AutoGenerateColumns="False" Name="dg"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding ProcessName}" /> 
    </DataGrid.Columns> 
</DataGrid> 

Если TagObject уникален по всем пунктам, то вы можете рассмотреть вопрос о создании SelectedValuePath="TagObject". Затем в коде вы можете обратиться к TagObject собственности выбранного объекта с SelectedValue:

var currentTagObject = dg.SelectedValue; 

В противном случае, вы можете получить весь выбранный объект с помощью SelectedItem.

var selectedObject = dg.SelectedItem; 

Однако, если вы хотите читать отдельные свойства из выбранного объекта, поскольку его тип анонимный тип, вы, вероятно, придется использовать отражение. Поэтому я предлагаю вам создать простой класс данных для объектов:

public class DataObject { 
    public string TagObject {get;set;} 
    public string ProcessName {get;set;} 
    public string FileName {get;set;} 
} 

Вы можете разместить логику для заполнения этих свойств либо в конструкторе DataObject «s, или в виде отдельной функции.

Тогда вы можете написать следующее:

dg.ItemsSource = Process.GetProcesses().Select(x => new DataObject { 
    TagObject = x, 
    ProcessName = x.ProcessName, 
    FileName = GetSafeFileName(x) 
}); 
Смежные вопросы