WP7 LongListSelector ItemsSource Проблема с привязкой данных - PullRequest
2 голосов
/ 30 марта 2011

Я пытаюсь реализовать LongListSelector в новом приложении WP7. LongListSelector существует в UserControl, связанном с моделью представления MVVMLight. Я получаю следующую ошибку при попытке загрузить UserControl:

System.ArgumentException не обработан Сообщение = Параметр неверен. Трассировки стека: в MS.Internal.XcpImports.CheckHResult (UInt32 ч) в MS.Internal.XcpImports.SetValue (INativeCoreTypeWrapper obj, свойство DependencyProperty, Double d) в System.Windows.DependencyObject.SetValue (свойство DependencyProperty, Double d) в System.Windows.FrameworkElement.set_Width (двойное значение) в Microsoft.Phone.Controls.LongListSelector.GetAndAddElementFor (кортеж ItemTuple) в Microsoft.Phone.Controls.LongListSelector.Balance () в Microsoft.Phone.Controls.LongListSelector.EnsureData () в Microsoft.Phone.Controls.LongListSelector.LongListSelector_Loaded (Отправитель объекта, RoutedEventArgs e) в System.Windows.CoreInvokeHandler.InvokeEventHandler (Int32 typeIndex, делегат handlerDelegate, отправитель объекта, аргументы объекта) в MS.Internal.JoltHelper.FireEvent (IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

Мне удалось сузить проблему до элементов в моем источнике привязки, однако я не вижу, в чем проблема.

Вот XAML из моего UserControl:

<UserControl x:Class="BTT.PinPointTime.WinPhone.Views.TaskSelectionControl"
         xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         FontFamily="{StaticResource PhoneFontFamilyNormal}"
         FontSize="{StaticResource PhoneFontSizeNormal}"
         Foreground="{StaticResource PhoneForegroundBrush}"
         d:DesignHeight="480"
         d:DesignWidth="480"
         DataContext="{Binding Source={StaticResource Locator}, Path=TaskSelection}">

<UserControl.Resources>
    <DataTemplate x:Key="itemTemplate">
        <StackPanel Grid.Column="1"
                    VerticalAlignment="Top">
            <TextBlock Text="{Binding Name}"
                       FontSize="26"
                       Margin="12,-12,12,6" />
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="groupHeaderTemplate">
        <Border Background="YellowGreen"
                Margin="6">
            <TextBlock Text="{Binding Title}" />
        </Border>
    </DataTemplate>

    <DataTemplate x:Key="groupItemTemplate">
        <Border Background="Pink"
                Margin="6">
            <TextBlock Text="{Binding Title}" />
        </Border>
    </DataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
    <Grid x:Name="ContentPanel"
          Grid.Row="1"
          Margin="12,0,12,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <toolkit:LongListSelector Grid.Row="1"
                                  Background="Red"
                                  ItemsSource="{Binding GroupedTasks}"
                                  GroupItemTemplate="{StaticResource groupItemTemplate}"
                                  ItemTemplate="{StaticResource itemTemplate}"
                                  GroupHeaderTemplate="{StaticResource groupHeaderTemplate}">
            <toolkit:LongListSelector.GroupItemsPanel>
                <ItemsPanelTemplate>
                    <toolkit:WrapPanel />
                </ItemsPanelTemplate>
            </toolkit:LongListSelector.GroupItemsPanel>
        </toolkit:LongListSelector>
    </Grid>
</Grid>

А вот код, который я использую для заполнения свойства GroupedTasks в моей модели представления (оно объявлено как ObservableCollection> GroupedTasks):

 private void LoadData()
    {
        if (App.Database.Query<Task, Guid>().Count() > 0)
        {
            GroupedTasks.Clear();

            var tasks = (from t in App.Database.Query<Task, Guid>().ToList() select t.LazyValue.Value);

            var groupedTasks = from t in tasks
                               group t by t.FullParentString into t1
                               orderby t1.Key
                               //select new Group<Task>(t1.Key, t1);
                               select new Group<Task>(t1.Key);

            foreach (Group<Task> o in groupedTasks)
            {
                GroupedTasks.Add(o);
            }

            foreach (Group<Task> g in GroupedTasks)
            {
                var currentTasks = (from t in tasks where t.FullParentString == g.Title select t);

                foreach (Task t in currentTasks)
                {
                    g.Add(t);
                }
            }
        }

        _isDataLoaded = true;
    }

и, наконец, вот объявление класса моей группы:

public class Group<T> : ObservableCollection<T>
{

    public string Title
    {
        get;
        set;
    }

    public bool HasItems
    {
        get
        {
            return Count != 0;
        }
        private set
        {
        }
    }

    public Group(string name)
    {
        this.Title = name;
    }
}

Первоначально я реализовал это как простой IEnumerable согласно турориалу на Windows Phone Geek. Однако это дало мне точно такую ​​же ошибку.

Я не получаю никаких ошибок привязки, однако я не вижу ничего, что позволило бы мне найти источник проблемы.

1 Ответ

1 голос
/ 30 марта 2011

Ответ найден здесь: http://silverlight.codeplex.com/workitem/7707. В основном добавьте ширину и высоту к LongListSelector.

...