【问题标题】:Binding a C# class to XAML for WP7将 C# 类绑定到 WP7 的 XAML
【发布时间】:2012-06-13 01:19:53
【问题描述】:

好的,所以我已经研究了好几个小时,但仍然无法弄清楚为什么我的 ViewModel 中的数据没有绑定到我的主页中的 XAML。我什至开始了一个新项目并以同样的方式实现它,所以我认为它可能与命名空间或我不太熟悉的东西有关。

当我的应用程序启动时,我在 App.cs 中创建了一个全局 ViewModel,用于将数据绑定到我的 XAML 视图。

public HomeViewModel ViewModel { get; private set; }

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    ViewModel = new HomeViewModel();
    (App.Current as App).RootFrame.DataContext = (App.Current as App).ViewModel;
}

然后 HomeViewModel 看起来像这样:

public class HomeViewModel : INotifyPropertyChanged
{       
    /***View Model***/

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public HomeViewModel()
    {   
        PropertyChanged = new PropertyChangedEventHandler(delegate { });
    }

    public Profile CurrentProfile; /*EDIT: Missing {get;set;} Which is necessary for
                                    *any property, including ones below that I 
                                    *referenced in the XAML
                                    */

    public string NotificationImage; 

    public ButtonPanelPath UniversalButtonPath;

    public void setProfile(Profile p)
    {
        CurrentProfile = p;
        NotifyPropertyChanged("CurrentProfile");
    }
    .
    .
    ....rest of access methods and properties

现在,当我的程序运行时,我 100% 确定 HomeViewModel 中的数据正在更新,并且每次“设置”新字段时都会调用 NotifyPropertyChanged 方法。

这个类是绑定到 RootFrame 的吧?那么我不应该能够在我的主页的 xaml 中访问这些字段吗?这是主网格中堆栈面板中部分 xaml 的示例:

<Border BorderThickness="5" BorderBrush="Aqua" CornerRadius="20">
  <StackPanel Name="profileInfo"  DataContext="{Binding CurrentProfile}">
    <TextBlock Text="{Binding FirstName}" Name="profileName" FontSize="26" 
               FontWeight="Bold" HorizontalAlignment="Center" />
    <StackPanel Orientation="Horizontal">
      <StackPanel>
        <TextBlock Text="{Binding Level}" Name="userLevel" FontSize="32" 
                   Margin="10,0,0,0"/>
        <TextBlock Text="{Binding LevelName}" Name="levelName" FontSize="26" 
                   Margin="10,0,0,0"/>
        <TextBlock Text="{Binding PointsNeeded}" Name="pointsBar" 
                   Margin="10,0,0,0"/>
      </StackPanel>
      <Image x:Name="levelIcon" Source="{Binding PictureUrl}" 
             Margin="15,0,0,0"/>
    </StackPanel> 
  </StackPanel>
</Border>

所以这里的 Level、LevelName、PointsNeeded 和 PictureUrl 都是 Profile 中的公共字段(或 CurrentProfile,这是我正在引用的 Profile 的特定实例)。我试过 Profile.[field] 但这也没有用。如果有人能告诉我完成绑定缺少什么,将不胜感激。

顺便说一下,如果这意味着什么,命名空间如下所示
-MainPage 在 MyApp.src.pages
-App 在 MyApp
-HomeViewModel 在 MyApp.src.classes 中

提前感谢您提供有用的解决方案/cmets,如果您需要更多数据/信息,请尽管询问。

【问题讨论】:

  • 好吧,我发现一个大问题很有帮助,就是当你声明属性时这样做:"public Profile CurrentProfile {get; set;}" 而不是上面的做法。并对您将在 XAML 中使用 INotifyPropertyChanged 引用的所有其他属性执行相同操作
  • 很高兴您解决了您的问题 - 如果您弄清楚问题的真正原因,请发布答案!
  • 那里,我在代码部分添加了EDIT,是你的意思吗?
  • 我实际上的意思是你应该发布一个答案(下面,在答案部分)但是编辑问题也可以。这样,希望未来的一些用户在遇到同样问题时会发现此信息很有帮助。

标签: c# windows-phone-7 xaml binding mvvm


【解决方案1】:

您要查找的绑定是 {Binding Proptery.SubProperty}。

所以在您的情况下,例如 {Binding CurrentProfile.Level}。

您在 DataContext 中有一个“HomeViewModel”实例,因此您可以访问它的所有属性。如果有一个复杂类型作为属性,您必须访问该属性,即复杂类型的实例而不是类型,才能访问其“子”属性。

希望对你有帮助。

【讨论】:

  • 感谢您的回复。我尝试使用 {Binding Property.SubPropery} 但它不起作用。这就是为什么我试图将 CurrentProfile 绑定到 StackPanel,然后只从内部访问子属性,但显然这也不起作用。还有什么想法吗?
  • 我觉得它甚至没有重新确定它绑定到那个类,是否有一种快速简便的方法来测试以确保(除了我已经在做的)可能在调试器或其他东西中?
  • 可以直接绑定 HomeViewModel 的属性吗?例如“通知图像”。而且您必须创建属性,据我所知,公共字段不起作用...
  • 是的,你说得对,Kirk 所说的就是我开始做的事情。将属性绑定到堆栈面板后,您可以直接引用子属性,因为它的数据上下文现在是您绑定到堆栈面板的属性。这个例子对我不起作用的原因是因为我没有使用 {get; set;} 在我的属性定义中。
  • 没有 {get; set;} 属性不是属性,而是“公共字段”。这是用于 XAML 绑定的反射的区别
猜你喜欢
  • 2012-12-14
  • 2011-07-15
  • 2023-03-06
  • 2016-12-20
  • 2018-12-09
  • 1970-01-01
  • 2021-12-17
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多