Tengo una lista de objetos y estoy tratando de vincularla a un TreeView en WPF:

private List<SlideIssue> slideIssuesList = new List<SlideIssue>();

Aquí la XAML:

<Grid Grid.Row="2">
    <TreeView x:Name="mainTreeView" BorderThickness="0">

    </TreeView>
</Grid>

Y el intento vinculante:

TreeViewItem item = new TreeViewItem();
item.HeaderTemplate = headerTemplate;

foreach (var issue in slideIssuesList)
{
    if (slideNumber == issue.SlideNumber)
    {                                            
        TreeViewItem child = new TreeViewItem();

        child.ItemsSource = slideIssuesList;

        child.HeaderTemplate = itemTemplate;
        item.Items.Add(child);
    }
}
item.IsExpanded = true; 
mainTreeView.Items.Add(item);

En tiempo de ejecución, esto es lo que obtengo:

Here is the picture

Quiero acceder a las propiedades particulares del objeto "SlideIssue". ¿Cómo puedo hacer eso?

1
fairly99 21 mar. 2017 a las 23:38

2 respuestas

La mejor respuesta

Puede definir un DataTemplate para su tipo SlideIssue y vincular cualquier elemento de la plantilla a cualquiera de las propiedades de la clase 'public:

<TreeView x:Name="mainTreeView" BorderThickness="0"
                  xmlns:local="clr-namespace:WpfApplication1">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:SlideIssue}">
            <StackPanel>
                <TextBlock Text="{Binding SlideNumber}" />
                <TextBlock Text="{Binding SomeOtherPropertyOfSlideIssue}" />
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

Cambie "WpfApplication1" al nombre de namespace en el que se define la clase SlideIssue.

Funciona un poco. Pero he creado una plantilla complicada en C #, así que prefiero crearla desde allí. Solo tengo un problema: ¿me pueden ayudar a escribir esta línea de código en C #?

La forma más fácil y preferida de crear un DataTemplate mediante programación es utilizar el método XamlReader.Parse:

DataTemplate dataTemplate = System.Windows.Markup.XamlReader.Parse("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:local=\"clr-namespace:WpfApplication1;assembly=WpfApplication1\" DataType=\"{x:Type local:SlideIssue}\"><StackPanel><TextBlock Text=\"{Binding SlideNumber}\" /><TextBlock Text=\"{Binding SomeOtherPropertyOfSlideIssue}\" /></StackPanel></DataTemplate>") as DataTemplate;

Solo recuerde reemplazar "WpfApplication1" con el nombre real del espacio de nombres y ensamblaje en el que se define su clase SlideIssue.

1
mm8 23 mar. 2017 a las 08:31

Debe anular el método ToString () en la clase SlideIssue. Cuando vincula cualquier objeto para controlarlo, llame al método ToString () para imprimir datos, si ToString () no se anula, imprima el nombre de la clase de referencia.

1
Uriu 21 mar. 2017 a las 21:02