0

Я структурировал классы, подобные этому для моего универсального приложения. В настоящее время работает в WP8.1.Null datacontext в usercontrol- WP8.1 C#

Следующие классы помещаются в общий код. (Надеясь использовать его в Win8.1)

  • FolderItemViewer.xaml (UserControl) Это в DataTemplate для ListView в классе FolderCollection MainPage.xaml
  • , который является коллекция, которая связана с Listview в MainPage.xaml на WP

Теперь проблема, я телеграфировал манипуляции события к DataTemplate сетям в FolderItemViewer.xaml захватить правую и левую красть, и она работает. Теперь, основываясь на этом, мне нужно обновить этот CollectionItem в классе FolderCollection и, следовательно, ListView в Mainpage.xaml.

  1. Как я могу захватить этот элемент списка или привязку коллекции, поскольку события манипуляции лежат в классе FolderItemViewer?
  2. Могу ли я получить элемент списка? Или изменилась функция обратного вызова в шаблон списка listlivew? или что-то вроде этого?

EDIT

К сожалению, чтобы положить в так много кода. Но действительно оцените чью-то помощь в правильном правиле.

Это FolderItemViewer.xaml

<UserControl 
x:Class="JusWrite2.FolderItemViewer" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:JusWrite2" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 
<Grid x:Name="MainGrid"> 
    <Grid Height="60" Width="380" Margin="0,0,0,1"> 
     <Grid x:Name="ItemGrid" HorizontalAlignment="Left" VerticalAlignment="Center" Width="380" Height="60" Background="Transparent" Canvas.ZIndex="2" 
             ManipulationMode="TranslateX,System" ManipulationStarted="On_ChannelItem_ManipulationStarted" ManipulationDelta="On_ChannelItem_ManipulationDelta" ManipulationCompleted="OnChannelItemManipulationCompleted"> 
      <TextBlock x:Name="titleTextBlock" Margin="20,0,0,0" Canvas.ZIndex="2" VerticalAlignment="Center" TextAlignment="Left" FontSize="25" > 
      </TextBlock> 
     </Grid> 
     <Grid x:Name="DelGrid" Opacity="0.0" HorizontalAlignment="Right" VerticalAlignment="Center" Height="60" Background="Red" Canvas.ZIndex="-1" Tapped="On_ChannelDelete_Tap" Width="380"> 
      <Button Content="X" FontSize="25" Canvas.ZIndex="-1" VerticalAlignment="Center" HorizontalAlignment="Center" Width="380" BorderThickness="0" /> 
     </Grid> 
    </Grid> 
</Grid> 
</UserControl> 

код за

private void OnChannelItemManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) 
    { 
     Grid ChannelGrid = (Grid)sender; 

     Grid mGrid = (Grid)(ChannelGrid.Parent); 

     Grid DeleteGrid = (Grid)((Grid)(ChannelGrid.Parent)).Children[1]; 

     FolderCollection swipedItem = ChannelGrid.DataContext as FolderCollection;// grid has null value for datacontext 

     double dist = e.Cumulative.Translation.X; 
     if (dist < -100) 
     { 
      // Swipe left 
     } 
     else 
     { 
      // Swipe right 
     } 

    } 

FolderCollection.xaml имеет два класса в нем. FolderItem и FolderCollection

public class FolderItem : INotifyPropertyChanged 
    { 
     // variables 

    public FolderItem() 
    { 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public int CompletionStatus 
    { 
     //code 
    } 

    public int Priority 
    { 
     //code 
    } 

    public string FolderText 
    { 
     //code 
    } 

    public int PenColor 
    { 
     //code 
    } 

    public string UUID 
    { 
     //code 
    } 

    public string CreateUUID() 
    { 
     //code 
    } 
} 

public class FolderCollection : IEnumerable<Object> 
{ 
    private ObservableCollection<FolderItem> folderCollection = new ObservableCollection<FolderItem>(); 

    private static readonly FolderCollection instance = new FolderCollection(); 

    public static FolderCollection Instance 
    { 
     get 
     { 
      return instance; 
     } 

    } 

    public IEnumerator<Object> GetEnumerator() 
    { 
     return folderCollection.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Add(FolderItem fItem) 
    { 
     folderCollection.Add(fItem); 
    } 


    public ObservableCollection<FolderItem> FolderCollectionInstance 
    { 
     get 
     { 
      return folderCollection; 
     } 
    } 
} 

И это MainPage.xaml где я данные связаны.

// Resources 
    <DataTemplate x:Key="StoreFrontTileTemplate"> 
     <local:FolderItemViewer /> 
    </DataTemplate> 

    <ListView x:Name="FolderListView" ItemsSource="{Binding}" 
        SelectionMode="None" 
        ItemTemplate="{StaticResource StoreFrontTileTemplate}" 
        ContainerContentChanging="ItemListView_ContainerContentChanging"> 
    </ListView> 

код за

//Constructor 
    FolderListView.DataContext = fc.FolderCollectionInstance; 
    FolderListView.ItemsSource = fc.FolderCollectionInstance; 


    private void ItemListView_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) 
    { 
     FolderItemViewer iv = args.ItemContainer.ContentTemplateRoot as FolderItemViewer; 

     if (args.InRecycleQueue == true) 
     { 
      iv.ClearData(); 
     } 
     else if (args.Phase == 0) 
     { 
      iv.ShowPlaceholder(args.Item as FolderItem); 

      // Register for async callback to visualize Title asynchronously 
      args.RegisterUpdateCallback(ContainerContentChangingDelegate); 
     } 
     else if (args.Phase == 1) 
     { 
      iv.ShowTitle(); 
      args.RegisterUpdateCallback(ContainerContentChangingDelegate); 
     } 
     else if (args.Phase == 2) 
     { 
      //iv.ShowCategory(); 
      //iv.ShowImage(); 
     } 

     // For imporved performance, set Handled to true since app is visualizing the data item 
     args.Handled = true; 
    } 

    private TypedEventHandler<ListViewBase, ContainerContentChangingEventArgs> ContainerContentChangingDelegate 
    { 
     get 
     { 
      if (_delegate == null) 
      { 
       _delegate = new TypedEventHandler<ListViewBase, ContainerContentChangingEventArgs>(ItemListView_ContainerContentChanging); 
      } 
      return _delegate; 
     } 
    } 
    private TypedEventHandler<ListViewBase, ContainerContentChangingEventArgs> _delegate; 

ответ

0

Элемент списка должен быть доступен в качестве контекста данных сетки: ChannelGrid.DataContext.

+0

DataContext является пустым :( – alfah

+0

Я добавил код XAML для FolderItemViewer.xaml в этом вопросе. – alfah

+0

то есть что-то не так с привязкой данных, если вы используете его в ListBox, то FolderItemViewer.xaml должно быть просто a DataTemplate –

Смежные вопросы