我不确定这是一个UWP问题,我的问题,还是一般的XAML ...... 我有一个名为UserGroup的自定义类。 UserGroup包含ObservableCollection。 User类只包含有关每个用户的其他信息。几乎所有内容都显示正常,输出窗口中没有绑定错误。我遇到的问题是显示的第一个ListView项目。在我将鼠标移动然后远离该控件之前,绑定似乎不会评估。一旦发生这种情况,就会显示绑定更新和字符串。有趣的是,如果我从ListView中删除第一个TextBlock,问题仍然存在于“第一”项目。如果它相关,我正在使用MVVM Light。
这是XAML:
<Grid x:Name="GridTrackingContainer"
RelativePanel.Below="BlkUserGroupName"
RelativePanel.AlignRightWithPanel="True"
RelativePanel.AlignLeftWithPanel="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GridView Grid.Column="1" x:Name="GridViewTracking" ItemsSource="{Binding Path=UserGroup.Users}"
HorizontalAlignment="Center" HorizontalContentAlignment="Stretch">
<GridView.ItemContainerStyle>
<Style TargetType="GridViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</GridView.ItemContainerStyle>
<GridView.ItemTemplate>
<DataTemplate>
<ListView HorizontalAlignment="Center" Margin="10,0,10,0" >
<ListView.Resources>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</ListView.Resources>
<TextBlock Text="{Binding Path=NickName}"/>
<TextBlock Text="{Binding Path=UserStats.TimeStarted, Converter={StaticResource DateConverter},ConverterParameter=\{0:hh:mm tt\}}"
ToolTipService.ToolTip="Time Started"/>
<TextBlock Text="{Binding Path=UserStats.TimeUpdated, Converter={StaticResource DateConverter},ConverterParameter=\{0:hh:mm tt\}}"
ToolTipService.ToolTip="Time Updated"/>
<TextBlock Text="{Binding Path=UserStats.TimeEnded, Converter={StaticResource DateConverter},ConverterParameter=\{0:hh:mm tt\}}"
ToolTipService.ToolTip="Time Ended"/>
</ListView>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
我在绑定实际填充文本之前和之后检查了可视化树... 之前:
如果我为StackPanel更改了ListView,则所有内容都会立即正确显示。有人有什么想法吗?
更新:这是UserGroup模型:
public class UserGroupModel : INotifyPropertyChanged
{
public class UserGroup : INotifyPropertyChanged
{
public string UserGroupName { get; set; }
private ObservableCollection<User> _Users;
public ObservableCollection<User> Users
{
get { return _Users; }
set
{
_Users = value;
NotifyPropertyChanged("Users");
}
}
// Property Change Logic
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class User : INotifyPropertyChanged
{
//public string NickName { get; set; }
private string _NickName;
public string NickName
{
get { return _NickName; }
set
{
_NickName = value;
NotifyPropertyChanged("NickName");
}
}
private UserStatistics _UserStats;
public UserStatistics UserStats
{
get { return _UserStats; }
set
{
_UserStats = value;
NotifyPropertyChanged("UserStats");
}
}
// Property Change Logic
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class UserStatistics : INotifyPropertyChanged
{
private DateTime _TimeStarted;
public DateTime TimeStarted
{
get { return _TimeStarted; }
set
{
_TimeStarted = value;
NotifyPropertyChanged("TimeStarted");
}
}
private DateTime _TimeUpdated;
public DateTime TimeUpdated
{
get { return _TimeUpdated; }
set
{
_TimeUpdated = value;
NotifyPropertyChanged("TimeUpdated");
}
}
private DateTime _TimeEnded;
public DateTime TimeEnded
{
get { return _TimeEnded; }
set
{
_TimeEnded = value;
NotifyPropertyChanged("TimeEnded");
}
}
// Property Change Logic
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
// Property Change Logic
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
更新#1: 如果我像这样添加第二个(相同的)Textblock ..
<TextBlock Text="{Binding NickName}"/>
<TextBlock Text="{Binding NickName}"/>
第二个TextBlock正确填充,并立即填充。也许这是一个错误?
更新#2: 我的项目的简化版本可以在这里下载: https://github.com/pboyvb/mcve2
我认为我找到了问题,而不是解决方案。我的应用程序使用框架导航到每个页面。此框架位于Shell.xaml中。在Shell.xaml的代码隐藏中,我将初始页面设置为StatusView。 我使用这种方法导航到不同的框架:
public void NavigateToPage(MenuItems item)
{
switch (item)
{
case MenuItems.Status:
FrameMainView.Navigate(typeof(StatusView));
break;
case MenuItems.Tracking:
FrameMainView.Navigate(typeof(TrackingView));
break;
}
}
如果我在Shell.xaml的代码隐藏中将初始页面设置为我的TrackingView,那么TrackingView上的绑定就可以了。所以我的假设是,它与我如何导航到不同的页面(框架)有关。所以问题是为什么,我该如何解决这个问题? 我正在使用帧导航策略,因为我希望我的所有页面都包含在Shell.xaml的框架中。我正在查找我的菜单按钮和列表,以及Shell.xaml中的一些其他全局UI元素。我无法找到利用MVVM导航服务来导航Shell.xaml中特定帧的方法。每当我使用MVVM Navigation时,它都会使用整个Shell.xaml页面/视图进行导航,我会完全丢失菜单按钮。
答案 0 :(得分:0)
尝试使用x:Bind而不是Binding。 https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension
注意:您需要使用x:DataType =“modelAlias:yourModel”
在DataTemplate标记中指定模型数据类型<DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
<StackPanel Orientation="Vertical" Height="50">
<TextBlock Text="{x:Bind Title}"/>
<TextBlock Text="{x:Bind Description}"/>
</StackPanel>
</DataTemplate>