访问XAML DataTemplate内的命名控件

时间:2017-07-06 18:28:53

标签: c# uwp

我设法在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方法,只选择一个项目。

提前致谢。问候。

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。请检查!