erikscandola
erikscandola

Reputation: 2936

C# WPF binding to method with ObjectDataProvider

I have a strange behaviour using ObjectDataProvider. I need to bind a TextBlock with ToString method but, when I enter in method my properties are wrong.

This is my simple ObjectDataProvider:

<Window.Resources>
    <ObjectDataProvider x:Key="ToString" MethodName="ToString" ObjectType="{x:Type entities:Season}" />
</Window.Resources>

And this is my ListView:

<ListView Grid.Row="2" Name="lvSeasons" HorizontalContentAlignment="Stretch">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="30" />
                </Grid.ColumnDefinitions>

                <TextBlock Grid.Column="0" Text="{Binding Source={StaticResource ToString}}" VerticalAlignment="Center" />
                <Button Grid.Column="1" VerticalAlignment="Center" Background="Transparent" BorderBrush="Transparent" Click="btDeleteSeason_Click">
                    <TextBlock FontFamily="{StaticResource FontAwesome}" Text="&#xf1f8;" FontSize="20" Foreground="Red" HorizontalAlignment="Center" />
                </Button>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

My method simply concat two properties:

public override string ToString()
{
    return StartYear + "/" + EndYear;
}

In debug I can see that start and end year are always 0. If I bind my TextBlock using {Binding StartYear} it's correct and value is 2019.

Where can the problem be?

Upvotes: 0

Views: 599

Answers (1)

Clemens
Clemens

Reputation: 128013

You do not need an ObjectDataProvider. Just write

<TextBlock Text="{Binding}" ... />

WPF will call the ToString method by default.

You do not even need to override ToString when you use a MultiBinding with an appropriate StringFormat:

<TextBlock ...>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}/{1}">
            <Binding Path="StartYear "/>
            <Binding Path="EndYear "/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Upvotes: 1

Related Questions