绑定到绑定物品?

Bind to bound item?

我有 Comments class,我绑定的是:

<ListBox ItemsSource="{Binding CommentFiles}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Text}" TextWrapping="Wrap"/>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding UserId}"/> <!-- Here should be username -->
                    <TextBlock Text=","/>
                    <TextBlock Text="{Binding CreatedAt}"/>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

如您所见,Comments class 有 UserId 属性,这只是一些字符组合。我可以使用异步 getUser(userID) 方法获得 User class 对象。
当我绑定到评论时,我想查看用户的用户名(在 User class 中)而不是 UserId。
而且我无法编辑 classes。有办法吗?

您可以将 userId 与采用 userId 的值转换器结合使用,调用 getUser(value) 和 returns 用户名。

<TextBlock Text="{Binding UserId, Converter={StaticResource MyUserIdConverter}" />

值转换器看起来像:

public class MyUserIdConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Add some checks here ;-)
        return GetUser((string) value);
    }

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

基于我的评论的一个小例子。您可以加载完整的用户,也可以仅加载用户名。

public class ExtendedCommentFile
{
    private readonly CommentFile _comment;

    public ExtendedComment(CommentFile comment)
    {
        _comment = comment;
    }

    public int UserId
    {
        get { return _comment.UserId; }
        set { _comment.UserId = value; }
    }

    public User User
    {
        get { return LoadTheUserHereOrInVM(); }
    }

    public string Username
    {
        get { return LoadTheUserNameHereOrInVM(); }
    }
}

/// <summary>
/// This is the unchangeable commentfile class
/// </summary>
public class CommentFile
{
    public string Text { get; set; }
    public int UserId { get; set; }
    public DateTime CreatedAt { get; set; }
}

/// <summary>
/// This is unchangeable user class
/// </summary>
public class User
{
}