我设法在GridViewItem的datatemplate中访问控件,代码如下:
clearAction()
GridCell是Gridview。
这项工作......但是..
如果我用少于40个项目实现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;
}
,那就没问题了。
与我实现具有10000个项目的GridView
不同,使用方法发生的文本更改:gridView
,也会发生在其他项目中......我无法理解原因,因为{{1方法,只选择一个项目。
提前致谢。问候。
答案 0 :(得分:1)
我已经测试了您的代码,但我无法在我身边重现您的问题。就我而言,在GridView
中渲染10000个项目的性能很低。使用VisualTreeHelper
会带来更糟糕的表现。你可以绑定
带有mvvm ViewModel的datatemplate中TextBlock
的文本。您只需要
修改视图模型,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。请检查!