2017-07-06 32 views
0

我设法在GridViewItem,下面的代码的DataTemplate的访问控制:访问被命名的控件中的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; 
    } 

在栅格单元是一个GridView。

这项工作..但是..

如果我实现GridView少于40个项目它的一切权利。 如果我实现gridView 10000项,文本的变化,与法发生不同:btnChangePhoneNumber_Click,也发生在其他项目......并且由于在btnChangePhoneNumber_Click方法,只选择一个项目,我不能明白其中的道理。

在此先感谢。一声问候。

+0

一个问题:什么是您的DataTemplate样子?你在使用绑定吗?如果是这样,在代码隐藏中明确设置文本时,很可能会破坏绑定。当您滚动时,这会影响其他项目,因为DataTemplate将从视图中移出并回收并重用,以提高性能。切换到x:在您的DataTemplate中绑定,这将避免绑定被破坏,或直接在模型中而不是在视图中更新绑定值。 –

回答

1

我已经测试你的代码,但我无法重现您的问题在我的身边。就我而言,在您的GridView中渲染10000个项目的性能很差。而使用VisualTreeHelper会带来更糟糕的表现。你可以绑定 的TextBlock与MVVM视图模型的DataTemplate中的文本。你只需要 修改视图模型和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> 

我上传code sample到github上。请检查!

+0

非常感谢!这就是我想要的! –

相关问题