C# WPF MVVMLight получить выбранный элемент из таблицы данных в текстовом поле - PullRequest
0 голосов
/ 06 мая 2020

У меня большая проблема с получением значений из Datagrid selected row в текстовые поля. Пользователь должен выбрать одну строку, и представление должно получить значения из строки в заданном текстовом поле c. После того, как пользователь может вносить изменения в текстовое поле и обновлять базу данных. После нескольких часов обучения на Youtube и в Google я все еще не понимаю, как мне добраться до сути (значения из выбранной строки в текстовом поле). Пожалуйста, помогите мне

Ниже приведен код для View и ViewModel

UserControl:

<!--Database datagrid-->
        <materialDesign:Card Margin="5">
            <DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext}">

                <DataGrid.Columns>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgMachineID}" Binding="{Binding MachineID, Mode=TwoWay}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerId}" Binding="{Binding CustomerID}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCustomerName}" Binding="{Binding CustomerName}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCity}" Binding="{Binding City}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgCountry}" Binding="{Binding Country}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC1}" Binding="{Binding SpindleC1}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgSpindleC2}" Binding="{Binding SpindleC2}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHoningHead}" Binding="{Binding HoningHead}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgNCVersion}" Binding="{Binding NCVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHMIVersion}" Binding="{Binding HMIVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgHRIVersion}" Binding="{Binding HRIVersion}"/>
                    <materialDesign:DataGridTextColumn Header="{x:Static language:Lang.DgAHSVersion}" Binding="{Binding AHSVersion}"/>
                </DataGrid.Columns>
            </DataGrid>
        </materialDesign:Card>

ViewModel:

 //Operation button for save, update, delete and print
    public ICommand SaveCommand { get; private set; }
    public ICommand UpdateCommand { get; private set; }
    public ICommand DeleteCommand { get; private set; }
    public ICommand PrintCommand { get; private set; }
    public ICommand ShowAdvCommand { get; private set; }


    public ObservableCollection<Machine> DataContext { get; set; }
    public Machine MachineSelectedItem { get; set; }
    public object MachineDataGrid { get; private set; }

    //Datagrid string

    //PRWContext for general use
    private PRWContext context = new PRWContext();

    public MachineViewModel()
    {
        //Commands for save, update, delete and print
        SaveCommand = new RelayCommand(() => ExecuteSaveCommand());
        UpdateCommand = new RelayCommand(() => ExecuteUpdateCommand());
        DeleteCommand = new RelayCommand(() => ExecuteDeleteCommand());
        PrintCommand = new RelayCommand(() => ExecutePrintCommand());


        ////Load the data from PRW Database to datagrid
        LoadData();
    }

    private void ExecuteSaveCommand()
    {
        Machine machine = new Machine
        {
            //Machine data
            MachineID = MachineID,
            CustomerID = CustomerID,
            CustomerName = CustomerName,
            City = City,
            Country = Country,

            //Serial data
            SpindleC1 = SpindleC1,
            SpindleC2 = SpindleC2,
            HoningHead = HoningHead,

            //Softwareversion data
            NCVersion = NCVersion,
            HMIVersion = HMIVersion,
            HRIVersion = HRIVersion,
            AHSVersion = AHSVersion
        };

        context.Machines.Add(machine);
        context.SaveChanges();

        ClearText();
    }

    private void ExecuteUpdateCommand()
    {
        Machine machine = context.Machines.FirstOrDefault(w => w.MachineID == MachineID);

        machine.CustomerID = CustomerID;
        machine.CustomerName = CustomerName;

        context.SaveChanges();
        ClearText();
    }

    private void ExecuteDeleteCommand()
    {
        throw new NotImplementedException();
    }

    private void ExecutePrintCommand()
    {
        throw new NotImplementedException();
    }

    //Load data from database to grid
    private void LoadData()
    {
        context.Machines.Load();
        this.DataContext = context.Machines.Local;
    }

    //Clear textboxes
    private void ClearText()
    {
        MachineID = string.Empty;
        CustomerID = string.Empty;
        CustomerName = string.Empty;
        City = string.Empty;
        Country = string.Empty;
        SpindleC1 = string.Empty;
        SpindleC2 = string.Empty;
        HoningHead = string.Empty;
        NCVersion = string.Empty;
        HMIVersion = string.Empty;
        HRIVersion = string.Empty;
        AHSVersion = string.Empty;
    }

Я пытаюсь это сделать с eventrigger для команды selectionchanged и несколькими разными способами, которые я видел в других вопросах, но мне не повезло: (

Ответы [ 2 ]

1 голос
/ 06 мая 2020

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

Как вы это сделали, вам нужно привязать (в вашем коде XAML ) ваш DataGrid в ваш ItemSource . Но также вы можете использовать свойство SelectdItem

Итак, в конечном итоге вы получите что-то похожее на это: (Я только что включил важные биты)

<DataGrid ItemsSource="{Binding DataContext}"  SelectedItem="{Binding Path=MachineSelectedItem }"/>

Вы можете получить дополнительные пояснения к существующему ответу , но то, что я поставил, должно помочь;)

0 голосов
/ 06 мая 2020

Несколько часов назад я обнаружил проблему в своем коде; ) Мне пришлось вставить следующие коды в мою ViewModel:

 private Machine machineSelectedItem;
    public Machine MachineSelectedItem
    {
        get { return machineSelectedItem; }
        set { machineSelectedItem = value; OnPropertyChanged(); }
    }

Command for SelectionChanged:

public ICommand SelectionChangedCommand { get; set; }` SelectionChangedCommand = new RelayCommand(() => ExecuteSelectionChangedCommand());` private void ExecuteSelectionChangedCommand()
    {
        **MachineID = machineSelectedItem.MachineID ? .ToString() ?? "";
        CustomerID = machineSelectedItem.CustomerID ? .ToString() ?? "";**
    }

и в View:

<DataGrid x:Name="MachineDataGrid" AutoGenerateColumns="False" MaxHeight="750" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" ItemsSource="{Binding DataContext, Mode=TwoWay}" SelectedItem="{Binding Path=MachineSelectedItem, Mode=TwoWay}">
                <ie:Interaction.Triggers>
                    <ie:EventTrigger EventName="SelectionChanged">
                        <ie:InvokeCommandAction Command="{Binding SelectionChangedCommand}"  CommandParameter="{Binding ElementName=MachineDataGrid, Path=SelectedItem}"/>
                    </ie:EventTrigger>
                </ie:Interaction.Triggers>

Это dos работа то, что мне нужно. Возможно, это уродливое решение, но на данный момент мне все равно.

...