2017-07-06 12 views
0

私はGridViewItem、次のコードのDataTemplateでコントロールにアクセスするために管理:グリッドセルは、GridViewのあるアクセス名前付きコントロール内のXAMLのDataTemplate

private void btnChangePhoneNumber_Click(object sender, RoutedEventArgs e) 
    { 
     GridCell.SelectedItem = GridCell.Items[3]; 
     var container = GridCell.ContainerFromIndex(3); 
     var _children = AllChildren(container); 
     var _control = _children.First(c => c.Name == "PhoneNumber"); 
     _control.text = "123456789"; 
    } 


public List<TextBlock> AllChildrenText(DependencyObject parent) 
    { 
     var _List = new List<TextBlock> { }; 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
     { 
      var _Child = VisualTreeHelper.GetChild(parent, i); 
      if (_Child is TextBlock) 
      { 
       _List.Add(_Child as TextBlock); 
      } 

      _List.AddRange(AllChildrenText(_Child)); 
     } 
     return _List; 
    } 

この作品..しかし..

私はそれがすべての権利未満40の項目でGridViewを実装する場合。 を10000個のアイテムで実装した場合とは異なり、メソッドで発生するテキストの変更:btnChangePhoneNumber_Clickは他のアイテムでも発生します。理由はわかりません。btnChangePhoneNumber_Clickメソッドでは1つのアイテムのみが選択されます。

ありがとうございます。挨拶。

+0

質問:DataTemplateの外観はどうなっていますか?バインディングを使用していますか?その場合は、コードビハインドでテキストを明示的に設定するときにバインディングを破る可能性が最も高いです。これは、パフォーマンスを向上させるために、DataTemplateがリサイクルされ、ビューから移動するときに再利用されるため、スクロールするときに他のアイテムに影響します。バインディングが壊れるのを避けるDataTemplateのx:Bindに切り替えるか、またはビューの代わりにモデルで直接バインドされた値を更新します。 –

答えて

1

私はあなたのコードをテストしましたが、自分の側で問題を再現できませんでした。私の言う限りでは、あなたのGridViewに10000個のアイテムをレンダリングするのはパフォーマンスが低いです。 VisualTreeHelperを使用すると、パフォーマンスが低下します。 のテキストをTextBlockのテキストとmvvm ViewModelをバインドすることができます。ビューモデルを変更するには が必要です。TextBlockのテキストが変更されます。詳細はData binding in depthを参照してください。次に、ViewModelのセグメントコードを示します。

MainPageViewModel.cs

public class MainPageViewModel : ViewModelBase 
{ 
    private ObservableCollection<Phone> _items; 
    public ObservableCollection<Phone> Items 
    { 
     get 
     { 
      return _items; 
     } 
     set 
     { 
      _items = value; 
      OnPropertyChanged(); 
     } 
    } 
    public MainPageViewModel() 
    { 
     var list = new ObservableCollection<Phone>(); 
     for (var i = 0; i < 1000; i++) 
     { 
      list.Add(new Phone { PhoneNumber = "123456" }); 
     } 
     _items = list; 
    } 

} 

MainPage.xamlを

<Page.DataContext> 
    <local:MainPageViewModel x:Name="ViewModel"/> 
</Page.DataContext> 
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Button Click="btnChangePhoneNumber_Click" Content=" click me"/> 
    <GridView x:Name="GridCell" Height="400" ItemsSource="{Binding Items}" > 
     <GridView.ItemTemplate> 
      <DataTemplate x:DataType="local:Phone"> 
       <TextBlock Text="{x:Bind PhoneNumber ,Mode=OneWay}"/> 
      </DataTemplate> 
     </GridView.ItemTemplate> 
    </GridView> 
</StackPanel> 

私はgithubのにcode sampleをアップロードしています。チェックしてください!

+0

ありがとうございます!これは私が欲しかったものです! –

関連する問題