繁体   English   中英

访问XAML DataTemplate内部的命名控件

[英]Access a Named Control Inside a XAML DataTemplate

我设法在GridViewItem的数据模板中访问以下代码:

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;
    }

GridCell是Gridview。

这项工作..但是..

如果我用少于40个项目实现GridView ,那就好了。 如果我实现了与gridView有10000项,与该方法发生了变化的文字: btnChangePhoneNumber_Click ,也发生在其他项目......既然,在我无法理解的原因btnChangePhoneNumber_Click方法,只选择一个项目。

提前致谢。 一声问候。

我已经测试了您的代码,但是无法在您这一边重现您的问题。 就我而言,在GridView渲染10000个项目的性能很差。 并且使用VisualTreeHelper会带来较差的性能。 您可以使用mvvm ViewModel绑定数据模板中的TextBlock文本。 您只需要修改视图模型, TextBlock的文本就会更改。 有关更多信息,请参阅深入数据绑定 以下是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。 请检查!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM