在指针离开

时间:2017-05-01 01:03:37

标签: c# xaml listview uwp mvvm-light

我不确定这是一个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>

我在绑定实际填充文本之前和之后检查了可视化树... 之前:

Notice the EvaluatedValue is "0", and IsBindingValid is False

指针进入和退出后(我认为这是正确的事件): enter image description here

如果我为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页面/视图进行导航,我会完全丢失菜单按钮。

1 个答案:

答案 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>