Добавление новой строки в DataGrid при нажатии кнопки - PullRequest
0 голосов
/ 11 июля 2019

Я новичок в WPF, и у меня возникли проблемы с добавлением новой строки в сетку данных при нажатии кнопки.Я пробовал несколько решений, но не удалось.

Пробовал - Если я включаю "CanUserAddRows =" True ", это также дает мне кнопки, которые присутствуют в верхних строках. Также я не хочу такой подход, как я хочу тДобавить новую строку при нажатии кнопки.

Я прилагаю изображение того, как выглядит новая строка, если я использую "CanUserAddRows =" True "

<StackPanel Name="Decrypt_Vault">
                            <DataGrid  x:Name="gdDecryptVault" HorizontalAlignment="Left"  ColumnWidth="Auto" Margin="10,10,405,18"  AutoGenerateColumns="False" HorizontalGridLinesBrush="LightGray" VerticalGridLinesBrush="LightGray">

                                <DataGrid.Columns>
                                    <!--<DataGridTextColumn Header="Host" Binding="{Binding Path=Host}" Width="*" IsReadOnly="True" />-->
                                    <DataGridTemplateColumn Header="Host">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding Path=Host}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=Host, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <!--<DataGridTextColumn Header="Login" Binding="{Binding Path=Login}" Width="*" IsReadOnly="True" />-->
                                    <DataGridTemplateColumn Header="Login">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding Path=Login}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=Login, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <!--<DataGridTextColumn Header="Password" Binding="{Binding Path=Password}" Width="*" IsReadOnly="True"/>-->
                                    <DataGridTemplateColumn Header="Password" IsReadOnly="True">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                    <TextBlock Name="LinePassword" Text="{Binding Path=Password}" Visibility="{Binding Path=IsPasswordVisible, Converter={StaticResource BoolToVis}}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=Password, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <DataGridTemplateColumn Header="Password Actions" IsReadOnly="True">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <DockPanel>
                                                    <Button  Click="bTogglePassword_Click" ToolTip="Toggle Password"
                                                        Name="bTogglePassword" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/button_login1.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                    <Button Click="bCopyToClipBoard_Click" ToolTip="Copy Password to clipboard"
                                                        Name="bCopyToClipBoard" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/Copy_icon.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                </DockPanel>
                                                <!--<TextBlock Text="{Binding Path=Password}"></TextBlock>-->
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>

                                    <!--<DataGridTextColumn Header="Items" Binding="{Binding Path=Project.Name}" Width="*" IsReadOnly="True"/>-->
                                    <DataGridTemplateColumn Header="Items" Width="100">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding Path=Project.Name}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=Project.Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <!--<DataGridTextColumn Header="Created by" Binding="{Binding Path=CreatedBy}" Width="*" IsReadOnly="True"/>-->
                                    <DataGridTemplateColumn Header="Created By" >
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding Path=CreatedBy}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=CreatedBy, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <!--<DataGridTextColumn Header="Notes" Binding="{Binding Path=Notes}" Width="*" IsReadOnly="True"/>-->
                                    <DataGridTemplateColumn Header="Notes" Width="100">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <TextBlock Text="{Binding Path=Notes}"></TextBlock>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <TextBox Background="Aquamarine" Text="{Binding Path=Notes, Mode=TwoWay, UpdateSourceTrigger=Explicit}"/>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                    <DataGridTemplateColumn Header="Actions" Width="100">
                                        <DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <DockPanel>
                                                    <!--<Button Content="Edit" Click="EditVaultLine"/>-->
                                                    <Button  Click="EditVaultLine" ToolTip="Edit"
                                                        Name="Edit" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/edit.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                    <Button  Click="DeleteVaultLine" ToolTip="Delete"
                                                        Name="Delete" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/delete.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                </DockPanel>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellTemplate>
                                        <DataGridTemplateColumn.CellEditingTemplate>
                                            <DataTemplate>
                                                <DockPanel >
                                                    <Button  Click="SaveEditedVaultLine" ToolTip="Save"
                                                        Name="Save" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/save2.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                    <Button  Click="CancelEditVaultLine" ToolTip="Cancel"
                                                        Name="Cancel" Visibility="Visible"  Height="30" Width="30" >
                                                        <Image Source="/Images/erase.png" Stretch="Fill" Height="30" Width="30"/>
                                                    </Button>
                                                </DockPanel>
                                            </DataTemplate>
                                        </DataGridTemplateColumn.CellEditingTemplate>
                                    </DataGridTemplateColumn>

                                </DataGrid.Columns>
                            </DataGrid>
                        </StackPanel>



My .CS code to Bind data in Data-Grid
 var result = weekTaskView.getVaultRecordLines();
                List<VaultRecordLine> list = new List<VaultRecordLine>();
                foreach (var item in result.Entities)
                {
                    VaultRecordLine vrl = new VaultRecordLine();

                    if (item.Attributes.Contains("createdby"))
                    {
                        vrl.CreatedBy = item.Attributes["createdby"].ToString();
                    }
                    if (item.Attributes.Contains("new_account"))
                    {
                        vrl.Host = item.Attributes["new_account"].ToString();
                    }
                    if (item.Attributes.Contains("new_login"))
                    {
                        vrl.Login = item.Attributes["new_login"].ToString();
                    }
                    if (item.Attributes.Contains("new_password"))
                    {
                        vrl.Password = item.Attributes["new_password"].ToString();
                    }
                    if (item.Attributes.Contains("new_vaultid"))
                    {
                        vrl.Id = new Guid(item.Attributes["new_vaultid"].ToString());
                    }

                    list.Add(vrl);
                }
                gdDecryptVault.ItemsSource = list;

Требование-Когда я нажимаю кнопку «Добавить новую строку», мне нужна новая строка в режиме «РЕДАКТИРОВАТЬ», чтобы пользователь мог заполнить данные.Также мне нужны кнопки «Сохранить» и «Отмена» в конце строки, чтобы сохранить эти данные или «Отменить» соответственно.

1 Ответ

0 голосов
/ 11 июля 2019

Я создал небольшое примерное приложение, чтобы показать вам, как вы можете добавлять элементы в свою DataGrid.

Ваша DataGrid должна быть привязана к ObservableCollection<T>, где T - это тип вашего DataClass.Определение вашего DataGrid тогда выглядит примерно так:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Host" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Host, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Login" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Login, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Password" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Тогда у вас есть Button для добавления новых строк в ItemsSource DataGrid.Button может выглядеть следующим образом:

<Button Grid.Row="1" Content="Add item" Command="{Binding AddItemCommand}"/>

В вашем коде c # AddItemCommand, к которому привязана команда вашей кнопки, выглядит следующим образом:

private ICommand addItemCommand;
public ICommand AddItemCommand
{
    get { return addItemCommand ?? (addItemCommand = new RelayCommand(AddItem)); }
}

private void AddItem(object obj)
{
    Items.Add(new MyItem());
}

И ObservableCollection<T>где DataGrid имеет вид:

private ObservableCollection<MyItem> items;

public ObservableCollection<MyItem> Items
{
    get { return items ?? (items = new ObservableCollection<MyItem>()); }
}

Так что теперь, когда вы нажимаете кнопку, будет выполняться команда AddItemCommand, и это добавляет новый Item в ItemsSource DataGrid.


RelayCommand является реализацией ICommand -интерфейса.Так что вам не нужно использовать click-события.Таким образом, вы можете отсоединить ваши XAML-определения (View) от вашей C # -Logic (ViewModel).Это один из важных шагов для работы с MVVM-шаблоном.

public class RelayCommand : ICommand
{
    private readonly Action<object> execute;
    private readonly Predicate<object> canExecute;

    public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
    {
        if(execute == null)
            throw new ArgumentException(nameof(execute));
        this.execute = execute;
        this.canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return canExecute == null || canExecute(parameter);
    }

    public void Execute(object parameter)
    {
        execute(parameter);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
}

Если вы новичок в WPF, вам следует взглянуть на MVVM-шаблон.Это действительно полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...