将 C# 类绑定到 WP7 的 XAML

本文关键字:WP7 XAML 绑定 | 更新日期: 2023-09-27 18:36:54

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

当我的应用程序启动时,我在应用中创建一个全局视图模型.cs用于将数据绑定到我的 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 方法。

而且这个类绑定到根框架对吗?那么我不应该能够在主页的 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、PointsNeed和 PictureUrl 都是 Profile 中的公共字段(或 CurrentProfile 是我引用的 Profile 的特定实例)。我尝试了配置文件。[字段]但这也没有用。如果有人能告诉我我缺少什么来完成绑定,将不胜感激。

顺便说一下,命名空间如下,如果这意味着什么
-主页在MyApp.src中.pages
-应用程序在我的应用程序中
-HomeViewModel 在 MyApp.src.classes 中

提前感谢您的有用解决方案/评论,如果您需要更多数据/信息,请直接询问。

将 C# 类绑定到 WP7 的 XAML

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

所以在你的例子中,例如{绑定当前配置文件.级别}。

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

希望对您有所帮助。