2

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

3 に答える 3

2

Command代わりに使用して、プロパティを介して現在のPersonオブジェクトを渡すことをお勧めしCommandParameterます。このようなもの:

<Button Content="Clear" 
        Command="{Binding DataContext.ClearNameCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 
        CommandParameter="{Binding}" />

次に、オブジェクトのプロパティを設定するだけです(Personが実装しているようには見えないため、バインディングを更新しますINotifyPropertyChanged) 。

于 2011-05-23T16:35:49.840 に答える
2

DataContextボタンの継承を使用します。

var person = (sender as FrameworkElement).DataContext as Person;
person.Name = String.Empty;
于 2011-05-23T16:36:00.543 に答える
1

あなたは:を使うことができ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>
于 2011-05-23T16:39:18.773 に答える