好的,所以我现在已经磨了好几个小时了,仍然无法弄清楚为什么我的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 I引用的特定实例)。我试过Profile。[field]但是那也没用。如果有人能告诉我我缺少什么来完成绑定,那将非常感激。
顺便说一下命名空间如下,如果这意味着什么 -MainPage在MyApp.src.pages中 -App在MyApp中 -HomeViewModel位于MyApp.src.classes
中如果您需要更多数据/信息,请提前感谢您提供有用的解决方案/评论。
答案 0 :(得分:0)
您正在寻找的绑定是{Binding Proptery.SubProperty}。
因此,例如{Binding CurrentProfile.Level}。
您在DataContext中有一个“HomeViewModel”实例,因此您可以访问其所有的propteries。如果存在复杂类型作为属性,则必须访问属性,即复杂类型的实例,而不是类型,以访问其“子”属性。
希望它有所帮助。