C# WPF 使用 ObjectDataProvider 绑定到方法

C# WPF binding to method with ObjectDataProvider

我在使用 ObjectDataProvider 时有一个奇怪的行为。我需要用 ToString 方法绑定 TextBlock 但是,当我输入方法时,我的属性是错误的。

这是我的简单ObjectDataProvider:

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

这是我的 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>

我的方法简单地连接了两个属性:

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

在调试中我可以看到开始和结束年份始终为 0。如果我使用 {Binding StartYear} 绑定我的 TextBlock 它是正确的并且值为 2019。

问题出在哪里?

您不需要 ObjectDataProvider。随便写

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

WPF 默认会调用 ToString 方法。

当您使用具有适当 StringFormat 的 MultiBinding 时,您甚至不需要覆盖 ToString:

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