1

我正在尝试获取用户 profileImageURl 并将其绑定到图像。我有以下 C# 代码:

namespace IIVVYTwitter
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            DataContext = new ViewModel(this);
        }
    }

    class ViewModel : INotifyPropertyChanged
    {

        public User AccountImageUrl { get; set; }

        readonly Page page;

        public ViewModel(Page page)
        {
            this.page = page;
            LoadAccount = new TwitterCommand<object>(LoadAccountHolder);
        }


        public TwitterCommand<object> LoadAccount { get; set; }

        void LoadAccountHolder(object obj)
        {
            PinAuthorizer auth =
            new PinAuthorizer
            {
                Credentials = new LocalDataCredentials()
            };

            if (auth == null || !auth.IsAuthorized)
            {
                page.Frame.Navigate(typeof(oAuth));
                return;
            }

            var twitterCtx = new TwitterContext(auth);

            var accounts =
                from acct in twitterCtx.Account
                where acct.Type == AccountType.VerifyCredentials
                select acct;

            Account account = accounts.SingleOrDefault();
            LinqToTwitter.User user = account.User;

            new User
                 {
                     AccountImageUrl = user.ProfileImageUrl
                 };


            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("AccountImageUrl"));
            }
        }

    }
}

与此 XAML 链接:

<Page
    x:Class="IIVVYTwitter.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:IIVVYTwitter"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

<Grid>
    <Button Command="{Binding LoadAccount}">
         <Border>
              <Image x:Name="accountPicture" Source="{Binding AccountImageUrl}" />
         </Border>
    </Button>
</Grid>
</Page>

当我通过单击按钮运行命令时,代码运行但图像的源没有更新。

我很确定我绑定源数据的方式是有缺陷的。

提前致谢。

4

1 回答 1

2

我没有看到您在DataContext任何地方设置页面。如果没有正确定义DataContext,您正在使用的 Bindings 无法解析为任何数据对象。一个简单的示例是在OnNavigatedTo方法或页面的构造函数中,您需要执行以下操作:

this.DataContext = new ViewModel()

或类似的东西。根据您希望如何处理视图模型创建、生命周期等,有不同的方法可以连接数据上下文,但希望这能让您走上正确的道路。在您的代码中,您还可以调用page.DataContext = this;构造函数。

更新:您还需要在触发 PropertyChanged 事件时修复代码。你有

if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("ImageUrl"));
            }

应该

if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("AccountImageUrl"));
            }

请注意为属性名称传递的字符串的更改。您正在为不存在的属性触发更改事件。

更新 #2:您正在从 AccountImageUrl 返回一种用户。您应该返回实际的 http url 字符串,而不是自定义类型。如果 User 有一个指向 http Url 的属性,您可以将 Xaml 绑定更新为 AccountImageUrl.PropertyThatContainsRealUrl

更新#3:在你的代码中,你有

new User
                 {
                     AccountImageUrl = user.ProfileImageUrl
                 };

这是在新的用户对象上设置 AccountImageUrl。但是,您绑定到 ViewModel 的 AccountImageUrl。在某些时候,您必须将 AccountImageURl 设置为图像 url 字符串并在 AccountImageURL 上引发 PropertyChanged。因此,无论是在创建新用户之前还是之后,您都应该说this.AccountImageUrl = user.ProfileImageUrl. 希望我仍在关注您的代码以及您在评论中所做的更改。

于 2012-09-08T23:52:14.220 回答