Не удалось передать значения из представления в viewmodel через команды - PullRequest
0 голосов
/ 19 сентября 2018

Я реализую шаблон MVVM для моего приложения.У меня есть мои Представления, ViewModel, Модель и Команды и Конвертеры, которые реализуются.Теперь я не могу передать значения моих текстовых полей из моей таблицы данных в мою модель представления через привязку команды.Я могу нажать на кнопку, чтобы попытаться выполнить процесс обновления, но он не может передать значение текстовых полей.Есть ли что-то, что мне нужно изменить в моем классе команд?

Вот мой XAML:

<DataGrid AutoGenerateColumns="False" Grid.Row="2" Grid.ColumnSpan="4" Grid.RowSpan="3" x:Name="productionLineConfigDataGrid" Margin="70,0.2,70,0" ItemsSource="{Binding listAllProductionLineConfigs}">
<DataTemplate>
<StackPanel>
        <StackPanel Orientation="Horizontal">
                <TextBlock FontSize="12" Text="ID: " VerticalAlignment="Center" />
                <TextBlock x:Name="txtBlockLineId" FontSize="16" Foreground="MidnightBlue" Text="{Binding ProductionLineId, Mode=TwoWay}" VerticalAlignment="Center" />
        </StackPanel>
        <StackPanel>
                <Button x:Name="btnUpdate" Content="Update" VerticalAlignment="Center" HorizontalAlignment="Right" Click="btnUpdate_Click" Command="{Binding DataContext.updateProductionLineConfigCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:production_line_config_home}}}" CommandParameter="{Binding ProductionLineConfig}"/>
        </StackPanel>
</StackPanel>
</DataTemplate>
</DataGrid>

Вот метод из моей ViewModel:

public ProductionLineConfig ProductionLineConfig
    {
        get { return productionlineconfig; }

        set
        {
            productionlineconfig = value;
            OnPropertyChanged("ProductionLineConfig");
        }
    }

Thisэто сообщение об ошибке, которое я получаю:

System.Windows.Data Ошибка: 40: ошибка пути BindingExpression: свойство «ProductionLineConfig» не найдено в «объекте» «ProductionLineConfig» (HashCode = 47309994) ',BindingExpression: Path = ProductionLineConfig;DataItem = 'ProductionLineConfig' (HashCode = 47309994);Целевым элементом является «Кнопка» (Имя = '');свойство target равно 'CommandParameter' (тип 'Object')

Я включил изображение для своего приложения здесь

Это весь код xaml здесь и это весь код модели представления здесь

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

На основе вашего исходного кода я сделал пример реализации, чтобы удовлетворить ваши требования.

Образец виртуальной машины:

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;

namespace WpfApp5.ViewModels
{
    public class ProductionLineConfigViewModel : INotifyPropertyChanged
    {
        public CustomCommand<ProductionLineConfig> UpdateCommand { get; }

        public ProductionLineConfigViewModel()
        {
            PopulateProductionLineConfigs();
            UpdateCommand = new CustomCommand<ProductionLineConfig>(UpdateConfig, (u) => true);
        }

        private ObservableCollection<ProductionLineConfig> _listAllProductionLineConfigs;
        public ObservableCollection<ProductionLineConfig> listAllProductionLineConfigs
        {
            get { return _listAllProductionLineConfigs; }
            set
            {
                _listAllProductionLineConfigs = value;
                OnPropertyChanged();
            }
        }

        //  Call this from constructor.
        private void PopulateProductionLineConfigs()
        {
            listAllProductionLineConfigs = new ObservableCollection<ProductionLineConfig>
            {
                new ProductionLineConfig
                {
                    ProductionLineId = 1,
                    ProductionLineCode = "001",
                    ProductionLineCreatedDate = DateTime.Today.Date,
                    ProductionLineName = "safdsf",
                    ProductionLineStatus = true
                },
                new ProductionLineConfig
                {
                    ProductionLineId = 1,
                    ProductionLineCode = "002",
                    ProductionLineCreatedDate = DateTime.Today.Date,
                    ProductionLineName = "sadfadfsdf",
                    ProductionLineStatus = true
                }
            };
        }

        private void UpdateConfig(ProductionLineConfig config)
        {
            MessageBox.Show("Line Name update: " + config.ProductionLineName);
        }

        public event PropertyChangedEventHandler PropertyChanged;

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

    }

    public class ProductionLineConfig
    { 
        public int ProductionLineId { get; set; }

        public string ProductionLineCode { get; set; }

        public string ProductionLineName { get; set; }

        public bool ProductionLineStatus { get; set; }
        public DateTime ProductionLineCreatedDate { get; set; }
    }
}

Образец XAML:

<Window x:Name="Root" x:Class="WpfApp5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModels="clr-namespace:WpfApp5.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <viewModels:ProductionLineConfigViewModel/>
    </Window.DataContext>

    <Grid Background="#FF006E8C">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.ColumnSpan="4" Content="KAD ShopFloor System" HorizontalAlignment="Center" Margin="10" FontWeight="Bold" FontSize="30" FontFamily="Segoe UI" Foreground="White"/>
        <Separator Grid.ColumnSpan="4" Grid.RowSpan="3" Background="White" Margin="0,-35,-0.4,39.2"/>
        <DataGrid AutoGenerateColumns="False" Grid.Row="2" Grid.ColumnSpan="4" Grid.RowSpan="3" x:Name="productionLineConfigDataGrid" Margin="70,0.2,70,0"
                  ItemsSource="{Binding DataContext.listAllProductionLineConfigs, ElementName=Root}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="ID" Binding="{Binding ProductionLineId, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Production Line Code" Binding="{Binding ProductionLineCode, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Production Line Name" Binding="{Binding ProductionLineName, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Status" Binding="{Binding ProductionLineStatus, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Created Date" Binding="{Binding ProductionLineCreatedDate, Mode=TwoWay}"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Border BorderThickness="0" Background="BlanchedAlmond" Padding="10">
                        <StackPanel Orientation="Vertical" x:Name="stck">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontSize="12" Text="ID: " VerticalAlignment="Center" />
                                <TextBlock x:Name="txtBlockLineId" FontSize="16" Foreground="MidnightBlue" Text="{Binding ProductionLineId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontSize="12" Text="Line Code: " VerticalAlignment="Center" />
                                <TextBlock x:Name="txtBlockLineCode" FontSize="16" Foreground="MidnightBlue" Text="{Binding ProductionLineCode, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock FontSize="12" Text="Line Name: " VerticalAlignment="Center" />
                                <TextBox x:Name="txtLineName" FontSize="16" Foreground="MidnightBlue" Text="{Binding ProductionLineName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" />
                            </StackPanel>
                            <!--<StackPanel Orientation="Horizontal">
                                <TextBlock FontSize="12" Text="Status: " VerticalAlignment="Center" />
                                <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type DataGrid}},
                                    Path=DataContext.Statusstring}" SelectedValue="{Binding ProductionLineStatus, Converter={StaticResource statusToBooleanConverter}, Mode=TwoWay}" x:Name="cbProductionLineStatus" FlowDirection="LeftToRight" FontSize="16" Foreground="MidnightBlue"
                                    HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
                            </StackPanel>-->
                            <StackPanel>
                                <Button x:Name="btnUpdate" Content="Update" VerticalAlignment="Center" HorizontalAlignment="Right"
                                        Command="{Binding DataContext.UpdateCommand, ElementName=Root}"
                                        CommandParameter="{Binding}" />
                            </StackPanel>
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>

    </Grid>
</Window>

Пример вывода:

enter image description here

enter image description here

Ключевые изменения здесь,

  1. Вам необходимо изменить свой список на наблюдаемую коллекцию

  2. Создать пользовательскую команду, которая принимает объект, см. Этот пост: [UWP / MVVM] Включить / ОтключитьКнопка в столбце шаблона данных RadDataGrid, в которой есть команды, связанные с ними при условиях

  3. Параметр команды должен быть повторяющимся элементом, его можно получить с помощью CommandParameter={Binding}

  4. В двухсторонних привязках обязательно добавьте UpdateSourceTrigger=PropertyChanged

0 голосов
/ 19 сентября 2018

Я только догадываюсь об этом.

Предполагая, что ProductionLineConfig - это то, к чему вы привязываетесь для ProductionLineId в шаблоне.Тогда вы, вероятно, просто хотите передать свой источник привязки в качестве параметра команды

CommandParameter="{Binding}"

Когда {Binding} пусто, это означает, что Binding связан с любым Source .Что также является просто сокращением для ...

{Binding DataContext,RelativeSource={RelativeSource Self}}.

В свою очередь (если звезды совпадают), тогда это должен быть ваш ProductionLineConfig

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