locked
вопрос по Contextmenu RRS feed

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

  • У меня в проекте longlistselector, у которого в ItemTemplate стоит StackPanel с textBlock-ами. К StackPanel прицеплено ContextMenu. вопрос - как определить на каком именно элементе списка было вызвано меню и получить на него ссылку. Проект сделан по шаблону Pivot и TextBlock-и привязаны к соответствующему ModelViewItem-у. Вот код:

    <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" Tap="LongSel1_Tap" >
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>                           
                                <StackPanel Margin="0,0,0,17">
                                    <toolkit:ContextMenuService.ContextMenu>
                                        <toolkit:ContextMenu>
                                            <toolkit:MenuItem Header="Удалить" Click="MenuItem_Click_2"/>
                                        </toolkit:ContextMenu>
                                    </toolkit:ContextMenuService.ContextMenu>
                                    <TextBlock  Name="tbxName"  Text="{Binding LineOne}" 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>                       
                        </phone:LongListSelector.ItemTemplate>
                    </phone:LongListSelector>
                </phone:PivotItem>
    

    10 июня 2014 г. 13:19

Все ответы

  • Сделал такой обработчик:

    private void MenuItem_Click_2(object sender, RoutedEventArgs e)
            {
             var myControl = (MenuItem)sender;
               var Data= myControl.DataContext as ViewModels.ItemViewModel;
                string Sel_ID = "";
                    Sel_ID = Data.DataID;
                    using (var db = new ToDoDataContext { })
                    {
                        if (db.DatabaseExists() == false)
                        {
                            db.CreateDatabase();
                        }
                        var items = from c in db.Items where c.DataID.ToString() == Sel_ID select c;
                        foreach (var toDoItems in items)
                        {
                            db.Items.DeleteOnSubmit(toDoItems);
                        }
                        db.SubmitChanges();
                    }
                    App.ViewModel.LoadData();            
            }

    Работает, но не всегда срабатывает. Причем, при перезапуске приложения элементы, которые не удалились отображаются вновь. То есть похоже дело с удалением из базы. Вчем здесь может быть проблема?

    10 июня 2014 г. 22:00
  • Я так понимаю с контекст меню у Вас уже проблем нет, а возникла проблема с удалением из БД, да?
    18 июня 2014 г. 10:42
  • Да, скорее всего проблема с удалением. Причем не удаляется последний оставшийся элемент. После перезапуска приложения он спокойно удаляется. Насколько мне удалось понять, что Sel_Id, получаемый из ViewModel не соответствует DataID для удаляемого элемента и удаление просто игнорируется. Кстати вставил в цикл foreach
    db.SubmitChanges();
    18 июня 2014 г. 12:21
  • Так погодите, если Вы удаляете объекты в БД, это не значит что они сразу удалятся в UI. Вам нужно и из UI коллекции которую Вы прибиндили удалять айтем.
    18 июня 2014 г. 13:00
  • Спасибо за совет, воспользовался. Правда это не помогло. И дело не в БД а в том, что когда я сначала удаляю элемент из ViewModel (например условно говоря №2), затем добавляю (пусть будет №3) и после этого вновь удаляю тот элемент (№3), который теперь отображается на месте удаленного (это №2), то почему то ссылку получаю не на №3 а на уже удаленный №2. Может быть я как то некорректно ссылку получаю?

    вот код добавления элемента:

     private void ApplicationBarIconButton_Click_3(object sender, EventArgs e)
            {
                if (!IsStopWatchRunnung && IsDataChanged)
                {
                    ItemViewModel NewItem = new ItemViewModel();
                    NewItem.LineOne = "Отсчет № :" + TickNumber.ToString() ;
                    NewItem.LineTwo =DateTime.Now.ToString() ;
                    NewItem.LineThree ="Измерение сделано " + DateTime.Now.ToString() + ". \n" + "Время измерения - " + sw.Elapsed.ToString(@"hh\.mm\:ss\.ff");
                    NewItem.DataID = "";
                    App.ViewModel.Items.Add(NewItem);
    }
    }

    и удаления соответственно:

     private void MenuItem_Click_2(object sender, RoutedEventArgs e)
            {
             
                MenuItem myControl = new MenuItem();
                myControl = (MenuItem)sender;
                     var Data= myControl.DataContext as ViewModels.ItemViewModel;
                    int DataIndex = App.ViewModel.Items.IndexOf(Data);
                    App.ViewModel.Items.RemoveAt(DataIndex);
    }
                    

    DataIndex  в этом случае -1 и на последней строчке возникает исключение.

    22 июня 2014 г. 6:53
  • У коллекции Items какой тип ?
    23 июня 2014 г. 7:48
  •    public ObservableCollection<ItemViewModel> Items { get; private set; }
    24 июня 2014 г. 13:29
  • Семпл можете собрать для дебага?
    25 июня 2014 г. 7:29