Wpf Рекурсивная привязка - PullRequest
2 голосов
/ 12 ноября 2009

Я пытаюсь выяснить, как создать рекурсивное связывание в xaml. Я знаю о HierarchialDataTemplate, но это не то, что я хочу, потому что мой источник данных не является набором элементов. В частности, я создаю браузер исключений и пытаюсь найти наилучший способ выражения поля InnerException исключения (которое, конечно, является еще одним исключением, следовательно, рекурсией).

Этот браузер исключений является частью программы просмотра журнала, которую я создаю. Вот XAML для ListView:

<ListView x:Name="LogViewerOutput">
    <ListView.ItemTemplate>
        <DataTemplate DataType="Ushanka.Log.LogMessageEventArgs">
            <Expander Style="{StaticResource ExceptionTreeStyle}" Width="Auto">
                <Expander.Header>
                    <StackPanel Orientation="Horizontal">
                        <Image Stretch="Fill" Width="16" Height="16" Margin="5" 
                               Source="{Binding Path=Level, Converter={StaticResource LogLevelIconConverter}}" />
                        <TextBlock Text="{Binding Message}" />
                    </StackPanel>
                </Expander.Header>
                <Expander.Content>
                    <StackPanel Orientation="Vertical">
                        <TextBlock Text="{Binding Exception.Message}" />
                        <TextBlock Text="{Binding Exception.Source" />
                        <!-- Here I would like to somehow be able to recursively browse through the tree of InnerException -->
                    </StackPanel>
                </Expander.Content>
            </Expander>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Есть идеи? Это вообще возможно?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2009

Я бы создал DataTemplate для исключения и связал бы InnerException с ContentPresenter внутри него. ContentPresenter остановит цепочку, когда InnerExpception имеет значение NULL, и вы можете отформатировать исключения по своему усмотрению. Примерно так:

<DataTemplate DataType="{x:Type Exception}">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Message}" />
        <TextBlock Text="{Binding Source"   />
        <ContentPresenter Content="{Binding InnerException}"    />
    </StackPanel>
</DataTemplate>
0 голосов
/ 13 ноября 2009

код для поддержки получения типа исключения для заголовка:

class TypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.GetType().ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML:

<Window.Resources>

    <local:TypeConverter x:Key="TypeConverter"/>

    <DataTemplate DataType="{x:Type sys:Exception}">
        <Expander Header="{Binding Converter={StaticResource TypeConverter}}">
            <Expander.Content>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Message}" />
                    <TextBlock Text="{Binding Source}"   />
                    <ContentPresenter Content="{Binding InnerException}"    />
                </StackPanel>
            </Expander.Content>               
        </Expander>
    </DataTemplate>   

</Window.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...