当它们都在DataGridTemplateColumn中时,从Button清除TextBlock

|| 我有一个带有DataGridTemplateColumn的DataGrid。 DataGridTemplateColumn包含一个按钮和TextBlock。 我希望按下按钮将清除textBlock的文本。 我怎么做 ? XAML:
 <Grid>
    <DataGrid ItemsSource=\"{Binding Persons}\" AutoGenerateColumns=\"False\">
        <DataGrid.Columns>
            <DataGridTextColumn Header=\"Name\" Binding=\"{Binding Name}\">
            </DataGridTextColumn>
            <DataGridTemplateColumn Header=\"Mask Expiration Time\">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\">
                            <TextBlock Text=\"{Binding Name}\"></TextBlock>
                            <Button Name=\"btnClear\" Click=\"btnClear_Click\" >Clear</Button>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
CS代码:
 public partial class MainWindow : Window
{
    public List<Person> Persons { get; set; }

    public MainWindow()
    {
        Persons = new List<Person> { new Person { Name = \"James\" }, new Person { Name = \"Kate\" } };
        DataContext = this;
        InitializeComponent();
    }

    private void btnClear_Click(object sender, RoutedEventArgs e) {
        var clearbutton = (Button) sender;

        // clear the Name
    }
}

public class Person
{
    public string Name { get; set; }
}
    
已邀请:
使用继承的Button的
DataContext
var person = (sender as FrameworkElement).DataContext as Person;
person.Name = String.Empty;
    
我建议改用
Command
并通过
CommandParameter
属性传递当前的Person对象。像这样:
<Button Content=\"Clear\" 
        Command=\"{Binding DataContext.ClearNameCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}\" 
        CommandParameter=\"{Binding}\" />
那么您要做的就是设置对象的属性(并更新绑定,因为它看起来不像Person实现
INotifyPropertyChanged
)     
您可以使用
ICommand
public class ClearNameCommand : ICommand
{
    public bool CanExecute(object parameter, IInputElement target)
    {
        var person = parameter as Person;
        return (person != null && person.Name.Length > 0);
    }

    public void Execute(object parameter, IInputElement target)
    {
        var person = parameter as Person;
        if (person != null)
        {
            person.Name = String.Empty;
        }
    }
}
然后在XAML中:
<StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Right\">
    <TextBlock Text=\"{Binding Name}\"></TextBlock>
    <Button x:Name=\"btnClear\"
            Command=\"{StaticResource ClearCommand}\"
            CommandParameter=\"{Binding}\">Clear</Button>
</StackPanel>
    

要回复问题请先登录注册