списки без итератора в wpf

90
7

Скажем, есть перекрестный список:

public class A
{
public B Next { get; set; }

public String Value { get; set; }

public A(string value, B next)
{
this.Next = next;
this.Value = value;
}
}

public class B
{
public A Next { get; set; }
public int Value { get; set; }

public B(int value, A next)
{
this.Next = next;
this.Value = value;
}
}

public partial class MyWindow : Window
{

public A My_List{ get; set; }

public MyWindow()
{
Program program = new Program();

this.My_List = new A("value1", new B(1, new A("Value2", new B(2, new A("value3", new B(3, null))))));

this.DataContext = this;
InitializeComponent();
}
}

Как я могу показать * My_List * в Wpf? Я пытался:

<StackPanel>
<StackPanel.Resources>
<DataTemplate DataType="{x:Type WpfApplication2:A}" x:Key="A_Template">
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Path=Value}" />
<Label Content="---" />
<Label Content="{Binding Path=Next.Value}" />
<ItemsControl ItemsSource="{Binding Path=Next.Next}" ItemTemplate="{DynamicResource A_Template}">

<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

</ItemsControl>
</StackPanel>
</DataTemplate>
</StackPanel.Resources>

<ItemsControl ItemsSource="{Binding Path=My_List}"
ItemTemplate="{StaticResource A_Template}">

<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</StackPanel>

Но это не работает, я думаю, это потому, что * My_List * должен быть фактическим списком, а не первым элементом.

Редактировать: существует только пустое окно, нет вывода, нет ошибки компилятора, исключение из среды выполнения.

спросил(а) 2013-01-30T10:03:00+04:00 7 лет, 9 месяцев назад
1
Решение
92

Как я могу показать * My_List * в Wpf?

Если вы хотите использовать A как ItemsSource для ItemsControl, тогда вам нужно реализовать IEnumerable в A как это:

public class A : IEnumerable
{
public B Next { get; set; }

public String Value { get; set; }

public A(string value, B next)
{
this.Next = next;
this.Value = value;
}

#region IEnumerable Members

private class AEnumerator : IEnumerator
{
private readonly A head;

public AEnumerator(A head)
{
this.head = head;
}

#region IEnumerator Members

public object Current { get; private set; }

public bool MoveNext()
{
if (Current == null)
{
Current = head;
}
else
{
if (Current.GetType() == typeof(A))
{
Current = ((A)Current).Next;
}
else
{
Current = ((B)Current).Next;
}
}

return Current != null;
}

public void Reset()
{
throw new NotImplementedException();
}

#endregion
}

public IEnumerator GetEnumerator()
{
return new AEnumerator(this);
}

#endregion
}

ответил(а) 2013-01-30T10:29:00+04:00 7 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема