【问题标题】:Bindings not set for items not visible未为不可见的项目设置绑定
【发布时间】:2016-05-04 13:57:07
【问题描述】:

抱歉,这是一个愚蠢的问题。我正在维护这个不是我编写的疯狂的 Windows Phone 8.1 RT 动态应用程序。它将一大堆东西加载到 DataContext 中。屏幕上不可见的东西似乎没有得到它们的 DataContext。当我离开表单时,事件会触发。我需要做什么来解决这个问题?即使它滚动到视图中,它也不会加载。如果我向上滑动并单击后退按钮,我会看到该字段在转到上一页之前填充。

编辑 - 这是一些代码:

        <DataTemplate x:Key="com.somecompany.BarcodeboxRenderer">
            <Grid HorizontalAlignment="Stretch" DataContext="{Binding Item1}">
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Label}" HorizontalAlignment="Stretch" Style="{StaticResource labelstyle}" Grid.Row="0" />
                <somecompany:BarcodeBox IsReadOnly="{Binding DisplayOnly}" somecompany:DynamicDataBindingPath.BindingPath="{Binding FieldId}" Grid.Row="1" />
            </Grid>
        </DataTemplate>

That calls this but only if it's visible:

    public sealed class DynamicDataBindingPath:FrameworkElement
    {
        public static readonly DependencyProperty BindingPathProperty = DependencyProperty.RegisterAttached("BindingPath", typeof(string), typeof(DynamicDataBindingPath), new PropertyMetadata("", OnBindingPathPropertyChanged));

        public static string GetBindingPath(FrameworkElement target)
        {
            try
            {
                return (string)target.GetValue(BindingPathProperty);
            }
            catch (Exception)
            {
                return string.Empty;
            }
        }

        public static void SetBindingPath(FrameworkElement target, string value)
        {
            target.SetValue(BindingPathProperty, value);
            target.Loaded += Target_Loaded;
        }

        private static void Target_Loaded(object sender, RoutedEventArgs e) {
            var target = (FrameworkElement)sender;
        if (target is ...) { ... }
        else if (target is DatePicker)
        {
            int startingletterindex = value.IndexOf('.') + 1;
            string pathtobindto = "obj." + Char.ToUpper(value[startingletterindex]) + value.Substring((startingletterindex + 1));
            Binding newbind = new Binding();
            newbind.Path = new PropertyPath(pathtobindto);
            var contextsrc = findRealDataContext(target);
            newbind.Source = contextsrc.DataContext;
            newbind.Mode = BindingMode.TwoWay;
            (target as DatePicker).SetBinding(DatePicker.DateProperty, newbind);
        }
        else if (...)
     }

【问题讨论】:

  • 您提供的代码不足以回答您的问题。
  • 对问题标题的快速回答是,不可见的项目确实调用了它们的构造函数并设置了它们的数据上下文属性。我看到的最明显的问题可能是 DataContext 的 {binding Item1} 部分,因为转发器中的项目的 datacontext 属性由框架自动设置。
  • 如果控件不可见,则不会调用 Target_Loaded(...) 事件。如果我向上滚动以便看到控件,然后按后退按钮,数据会填充,我可以在它转到上一页之前看到它一秒钟。
  • 我添加了一些代码来显示调用 Target_Loaded(...) 事件时它的作用。它在那里设置绑定。
  • 好的,它正在订阅 FrameworkElement.Loaded,但是当控件第一次滚动到视图中时它没有触发。

标签: windows-phone-8.1 winrt-xaml datacontext


【解决方案1】:

我关闭了 ListView 虚拟化,它现在可以工作了。我不需要它,因为永远不会超过几行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多