UWP 模板查找和修改控件

UWP Template find and modify control

我有一个 TabView,其 header 和项目使用模板。我在 header 模板中找到了这些元素,但是当我以编程方式更改它们的可见性时,属性仍然保持不变。这是为什么?我该如何解决?

我已经尝试将文本 NameTextBlock 和 NameTextBox 更改为 "hello" "world" 之类的字符串,但它仍然显示原始文本。

    private void RenameClick(object sender, RoutedEventArgs e)
    {
        var flyoutItem = sender as MenuFlyoutItem;
        var tab = (TabViewItem)PlaylistTabView.ContainerFromItem(flyoutItem.DataContext);
        var header = tab.HeaderTemplate.LoadContent();
        RenameHeader(header, true, true);
    }

    private void RenameHeader(DependencyObject header, bool isEdit, bool selectAll)
    {
        var NameTextBlock = (TextBlock)VisualTreeHelper.GetChild(header, 1);
        NameTextBlock.Visibility = isEdit ? Visibility.Visible : Visibility.Collapsed;
        TextBox NameTextBox = (TextBox)VisualTreeHelper.GetChild(header, 2);
        NameTextBox.Visibility = isEdit ? Visibility.Collapsed : Visibility.Visible;
        if (selectAll) NameTextBox.SelectAll();
    }

---更新---

这是我的页眉模板:

        <controls:TabView.ItemHeaderTemplate>
            <DataTemplate x:DataType="data:Playlist">
                    <SymbolIcon Symbol="Audio" />
                    <TextBlock
                        x:Name="NameTextBlock"
                        Margin="10,0,5,0"
                        Text="{x:Bind Name, Mode=OneWay}" />
                    <TextBox
                        x:Name="NameTextBox"
                        Margin="10,0,5,0"
                        AcceptsReturn="True"
                        Background="Transparent"
                        ManipulationCompleted="NameTextBox_ManipulationCompleted"
                        Text="{x:Bind Name, Mode=TwoWay}"
                        Visibility="Collapsed" />
                </StackPanel>
            </DataTemplate>
        </controls:TabView.ItemHeaderTemplate>

在这种情况下,我建议使用绑定来解决您的问题。

可以尝试让class继承INotifyPropertyChanged接口,在属性变化时调用OnPropertyChanged方法

public class Playlist:INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后就可以绑定在HeaderTemplate.

<controls:TabView.ItemHeaderTemplate>
    <DataTemplate x:DataType="data:Playlist">
        <TextBlock Text={x:Bind Name, Mode=OneWay} />
    </DataTemplate>
</controls:TabView.ItemHeaderTemplate>

同样,如果您需要更改TextBlock的可见性,有两种方法。

首先是将Visibility属性添加到播放列表class,创建方法与Name属性相同。

第二种是根据一定的条件(比如IsEdit)通过IValueConverter进行转换。

此致。