locked
проблема с DataaTemplateSelector Windows Phone8 RRS feed

  • Общие обсуждения

  • Делаю приложение на основе стандартного Pivot-приложения. Мне нужно чтобы по тапу на элементе списка в Longlistselector изменялся стиль, Background например. Проблема в том, что при загрузки элементов списка из базы в ItemViewModel изменением свойства Type шаблон меняется при смене свойства. Но в обработчике SelectionChanged LongListselector при изменении свойства Type шаблон не меняется и все отображается так как было при загрузке модели. Код привожу.

     public abstract class DataTemplateSelector : ContentControl
        {
            public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                return null;
            }
    
            protected override void OnContentChanged(object oldContent, object newContent)
            {
                base.OnContentChanged(oldContent, newContent);
    
                ContentTemplate = SelectTemplate(newContent, this);
            }
        }
    
        public class ViewTemplateSelector : DataTemplateSelector
        {
            public DataTemplate Selected
            {
                get;
                set;
            }
    
            public DataTemplate UnSelected
            {
                get;
                set;
            }
    
            public DataTemplate NotDetermined
            {
                get;
                set;
            }
    
            public override DataTemplate SelectTemplate(object item, DependencyObject container)
            {
                ItemViewModel SelectItem = item as ItemViewModel;
                if (SelectItem != null)
                {
                    if (SelectItem.Type == "Selected")
                    {
                        return Selected;
                    }
                    else if (SelectItem.Type == "NotDetermined")
                    {
                        return NotDetermined;
                    }
                    else if (SelectItem.Type == "UnSelected")
                    {
                        return UnSelected;
                    }
                }
    
                return base.SelectTemplate(item, container);
            }
        }
    }
    
    namespace PivotApp1.ViewModels
    {
        public class ItemViewModel : INotifyPropertyChanged
        {
            private string _lineOne;
            /// <summary>
            /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки.
            /// </summary>
            /// <returns></returns>
            public string LineOne
            {
                get
                {
                    return _lineOne;
                }
                set
                {
                    if (value != _lineOne)
                    {
                        _lineOne = value;
                        NotifyPropertyChanged("LineOne");
                    }
                }
            }
    
            private string _lineTwo;
            /// <summary>
            /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки.
            /// </summary>
            /// <returns></returns>
            public string LineTwo
            {
                get
                {
                    return _lineTwo;
                }
                set
                {
                    if (value != _lineTwo)
                    {
                        _lineTwo = value;
                        NotifyPropertyChanged("LineTwo");
                    }
                }
            }
    
            private string _lineThree;
            /// <summary>
            /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки.
            /// </summary>
            /// <returns></returns>
            public string LineThree
            {
                get
                {
                    return _lineThree;
                }
                set
                {
                    if (value != _lineThree)
                    {
                        _lineThree = value;
                        NotifyPropertyChanged("LineThree");
                    }
                }
            }
    
    
            private string _DataID;
            /// <summary>
            /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки.
            /// </summary>
            /// <returns></returns>
            public string DataID
            {
                get
                {
                    return _DataID;
                }
                set
                {
                    if (value != _DataID)
                    {
                        _DataID = value;
                        NotifyPropertyChanged("DataID");
                    }
                }
            }
            private string _Type;
            public string Type
            {
                get { return _Type; }
                set
                {
                    if (value != _Type) _Type = value;
                    NotifyPropertyChanged("Type");
                }
            }
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String propertyName)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (null != handler)
                {
                    handler(this, new PropertyChangedEventArgs(propertyName));
                }
            }
        }
    }

    это загрузчик модели из MainViewModel

            /// Создает и добавляет несколько объектов ItemViewModel в коллекцию элементов.
            /// </summary>
            public void LoadData()
            {
                System.DateTime DataNow=System.DateTime.Now;
                using(var db= new ToDoDataContext())
                {
                    this.Items.Clear();
                    var items = from c in db.Items orderby c.CreationData descending select c;
                    var FItems = from c1 in db.Items where c1.IsFavorite == true orderby c1.CreationData descending select c1;
                    foreach(var toDoItems in items)
                    {
                        this.Items.Add(new ItemViewModel() { LineOne = toDoItems.Name, LineTwo = toDoItems.CreationData.ToString() + " - " + toDoItems.TimeValue, LineThree = toDoItems.Description, DataID = toDoItems.DataID.ToString(), Type = "UnSelected" });
                    
                }
    
               this.IsDataLoaded = true;
            }

    обработчик LongListSelector.SelectionChanged

     private void LongSel1_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
            {
    
                if (SelectedItem != null) SelectedItem.Type = "UnSelected";
                
                var MyControl = (LongListSelector)sender;
                var Data = MyControl.SelectedItem as ItemViewModel;
                SelectedItem= Data;
                SelectedItem.Type = "Selected";
                Data.Type = "Selected";
                //Data.LineOne = Data.LineOne + "***";
             
                }

    И вот XAML

    <phone:PhoneApplicationPage
        x:Class="PivotApp1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        
        xmlns:local="clr-namespace:PivotApp1"   
        
    
        mc:Ignorable="d"
        d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait"  Orientation="Portrait"
        shell:SystemTray.IsVisible="True"
        xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit">
        
        <phone:PhoneApplicationPage.ApplicationBar>
            <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
                <shell:ApplicationBarIconButton IconUri="/Assets/AppBar/transport.play.png" Text="Старт" Click="ApplicationBarIconButton_Click_1">
                </shell:ApplicationBarIconButton>
                <shell:ApplicationBarIconButton IconUri="/Assets/AppBar/stop.png" Text="Сброс" Click="ApplicationBarIconButton_Click_2">
                </shell:ApplicationBarIconButton>
               <shell:ApplicationBarIconButton IconUri="/Assets/AppBar/edit.png" Text="Изменить" Click="ApplicationBarIconButton_Click">
                </shell:ApplicationBarIconButton>
                <shell:ApplicationBarIconButton IconUri="/Assets/AppBar/save.png" Text="Сохранить" Click="ApplicationBarIconButton_Click_3">
                    </shell:ApplicationBarIconButton>
            </shell:ApplicationBar>
        </phone:PhoneApplicationPage.ApplicationBar>
        <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            
            <!--Элемент управления Pivot-->
            <phone:Pivot Name="pvtitle" Loaded="pvtitle_Loaded" Margin="0,120,0,29" >
                <!--Первый элемент Pivot-->
                <phone:PivotItem Header="Последние" Margin="14,10,10,18" Name="PvItem1" >
                    <!--Двухстрочный список с разбивкой текста на строки-->
                    <phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Items}" Name="LongSel1" SelectionChanged="LongSel1_SelectionChanged_1" >
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate x:Name="UnselectedItem">
                                <local:ViewTemplateSelector Content="{Binding}" >
                                    <local:ViewTemplateSelector.UnSelected >
                                        <DataTemplate>
                                         <StackPanel Margin="0,0,0,17" Name="Panel1" Background="Aqua">
                                          <TextBlock  Name="tbxName"  Text="{Binding LineOne, Mode=TwoWay}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}">
                                           </TextBlock>
                                          <TextBlock Text="{Binding LineTwo}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                          </StackPanel>
                                        </DataTemplate>
                                    </local:ViewTemplateSelector.UnSelected>
                                    <local:ViewTemplateSelector.Selected>
                                        <DataTemplate>
                                            <StackPanel Margin="0,0,0,17" Name="Panel1" Background="Bisque">
                                                <TextBlock  Name="tbxName"  Text="{Binding LineOne, Mode=TwoWay}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}">
                                                </TextBlock>
                                                <TextBlock Text="{Binding LineTwo}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </local:ViewTemplateSelector.Selected>
                                </local:ViewTemplateSelector>
                            </DataTemplate>                       
                        </phone:LongListSelector.ItemTemplate>
                    </phone:LongListSelector>
                </phone:PivotItem>
    
                <!--Второй элемент Pivot-->
                <phone:PivotItem Header="Подробнее">
                    <!--Двухстрочный список без разбивки текста на строки-->
                    <phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="LongSel1_SelectionChanged_1">
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,0,0,17">
                                    <TextBlock Text="{Binding LineOne}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}">
                                    </TextBlock>
                                    <TextBlock Text="{Binding LineThree}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/>     
                                   </StackPanel>
                            </DataTemplate>
                        </phone:LongListSelector.ItemTemplate>
                    </phone:LongListSelector>
                </phone:PivotItem>
                <!--Третий элемент Pivot-->
                <!--   <phone:PivotItem Header="Избранное"> -->
                <!--Двухстрочный список без разбивки текста на строки-->
                <!--   <phone:LongListSelector Margin="0,0,-12,0" ItemsSource="{Binding Items}">
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,0,0,17">
                                    <TextBlock Text="{Binding LineFour}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}">
                                    </TextBlock>
                                    <TextBlock Text="{Binding LineFive}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}">
                                    </TextBlock>
                                    <TextBlock Text="{Binding LineSix}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                              
                                </StackPanel>
                            </DataTemplate>
                        </phone:LongListSelector.ItemTemplate>
                    </phone:LongListSelector>
                </phone:PivotItem> -->
            </phone:Pivot>
            


    22 мая 2014 г. 3:14

Все ответы

  • Выложите, пожалуйста, тестовый проект на облако. Так больше шансов что Вам помогут.
    23 мая 2014 г. 16:58