gpt4 book ai didi

c# - 如何从 DataTemplate 获取 XAML 控件的值

转载 作者:太空宇宙 更新时间:2023-11-03 22:56:17 25 4
gpt4 key购买 nike

我尝试在我的 XAML 数据模板中定义的按钮单击事件中从我的 TextBox 获取一个值,如下所示:

        <GridView.ItemTemplate>
<DataTemplate x:DataType="data:Ausstattung">
<Grid Height="40" Width="Auto" Background="LightSlateGray" >

<TextBlock Grid.Column="0" Foreground="White" FontSize="14" Text="{x:Bind Beschreibung}" HorizontalAlignment="Center" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"/>
<TextBlock Grid.Column="1" Foreground="White" FontSize="14" Text="{x:Bind Ausgabedatum}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Grid.Column="2" Foreground="White" FontSize="14" Text="{x:Bind Rückgabedatum}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBox Grid.Column="3" Foreground="White" FontSize="14" x:Name="txtAnzahl" PlaceholderText="{x:Bind Anzahl}" TextChanged="TextBox_OnTextChanged" Width="50" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" Grid.Column="4" Margin="-25">

//here I want to get the value from the TextBox named "txtAnzahl"
<Button Height="30" Width="30" Margin="0,10,10,10" Padding="0" Click="ButtonBase_OnClick">
<TextBlock FontFamily="Segoe MDL2 Assets" Foreground="LimeGreen" Text="" FontSize="20"/>
</Button>
<Button Height="30" Width="30" Margin="0,10,10,10" Padding="0">
<TextBlock FontFamily="Segoe MDL2 Assets" Foreground="DarkRed" Text="" FontSize="16"/>
</Button>

</StackPanel>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>

所以我尝试从 Button OnClick 事件的文本框“txtanzahl”中获取值。

这是它在实时可视化树中的样子: enter image description here

我尝试使用 VisualTreeHelper 来完成它,但我只找到了 GetChild 或 GetParent 的示例,但在这种情况下,它既不是子对象也不是父对象。

我也无法像这样获得具有给定名称“txtAnzahl”的控件:

var anzahl = txtAnzahl.Text;

它说他不知道这个元素。

最佳答案

你可以获得Button的父级(即StackPanel),然后是它父级的父级(即Grid),然后去向下并找到 TextBox

但是……不要这样做。如果您更改了层次结构或 Panel 的类型怎么办?

因为您已经知道数据模板的DataContext类型(即Ausstattung),您应该创建另一个属性TextValue 并将其双向TextBox 绑定(bind)。然后,如果您使用 ButtonCommand,或者在代码隐藏中,您可以从 CommandParameter 获取它的值 -

private void ButtonBase_Click(object sender, RoutedEventArgs e)
{
var button = (ButtonBase)sender;
var dataContext = (Ausstattung)button.DataContext;
var value = dataContext.TextValue;
}

您的类需要实现 INotifyPropertyChanged。之后,像这样创建一个新属性 -

using System.ComponentModel;
using System.Runtime.CompilerServices;
using App1.Annotations;

namespace App1
{
public class Ausstattung : INotifyPropertyChanged
{
private string _textValue;
public string TextValue
{
get => _textValue;
set
{
_textValue = value;
OnPropertyChanged();
}
}

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}

在您的 xaml 中,执行此操作 -

<TextBox Text="{x:Bind TextValue, Mode=TwoWay}" Grid.Column="3" Foreground="White" FontSize="14" x:Name="txtAnzahl" PlaceholderText="{x:Bind Anzahl}" TextChanged="TextBox_OnTextChanged" Width="50" HorizontalAlignment="Center" VerticalAlignment="Center"/>

关于c# - 如何从 DataTemplate 获取 XAML 控件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45232598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com