Как я могу обновить элементы управления моим текстовым полем, когда связанный объект установлен на новый объект в моей модели представления? - PullRequest
0 голосов
/ 18 октября 2019

Я новичок в WPF и столкнулся с проблемой в проекте, над которым я работаю, используя шаблон MVVM (caliburn micro).

Моя проблема заключается в следующем. У меня есть коллекция объектов, привязанных к DataGrid, и выбор текстовых полей, полей со списками, флажков и т. Д., Все они привязаны к различным свойствам одного объекта другого класса - который я назвал своим входным объектом.

мой пользовательский интерфейс

То, что я хочу, заключается в следующем: когда я нажимаю кнопку «Добавить», я хочу, чтобы новый объект был добавлен в мою коллекцию данных и мойобъект ввода должен быть установлен в новый экземпляр этого объекта ввода, чтобы новые значения могли быть введены и в конечном итоге добавлены в мою коллекцию, связанную с сеткой данных.

Это работает в некоторой степени, когда программа запускается первойОбъект может быть добавлен в коллекцию без проблем.

Первый объект добавляется по назначению

Однако, когда я иду, чтобы добавить последующие объекты, мне приходится вводить все значения дважды. При первом вводе значения оно сбрасывается обратно к значению по умолчанию для нового объекта, когда фокус покидает этот элемент управления, заставляя меня снова вводить его - после чего он остается там.

Попытка изменить значение - значение примечания не изменилось после изменения базового объекта, нажав кнопку добавления

Значение изменяется только на новое пустое значение, когда новое значение было предпринятовводится, и фокус пользователя покидает текстовое поле

После повторного ввода остается тем же самым и может быть добавлено в сетку данных OK

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

Вот соответствующий код XAML:


    <TextBox Grid.Column="5" Grid.Row="2" Width="140" Text="{Binding Path=MyInputObj.WeightFloatInput, Mode=TwoWay}"/>
        <TextBox Grid.Column="5" Grid.Row="3" Width="140" Text="{Binding Path=MyInputObj.RunLabelInput, Mode=TwoWay}"/>
        <ComboBox Grid.Column="5" Grid.Row="4" ItemsSource="{Binding Path=MyInputObj.MethodsArray}" SelectedValue="{Binding Path= MyInputObj.MethodStringInput, Mode=TwoWay}" />
        <CheckBox Grid.Column="5" Grid.Row="5" HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Path= MyInputObj.ReassayInput, Mode=TwoWay}"/>
        <CheckBox Grid.Column="5" Grid.Row="6" HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Path= MyInputObj.StandardInput, Mode=TwoWay}"/>
        <Button Content="Add" Grid.Column="5" Grid.Row="7" HorizontalAlignment="Center" VerticalAlignment="Center" Command="{Binding AddButtonCommand}"/>


        <DataGrid IsReadOnly="True" CanUserAddRows="False" AutoGenerateColumns="False" x:Name="Weights"  Grid.Row="1" Grid.RowSpan="8" Grid.Column="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding ElementName=Weights, Path=SelectedItem}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Method" Binding="{Binding ChosenMethodString, Mode=OneWay}"/>
                <DataGridTextColumn Header="Weight" Binding="{Binding WeightFloat, Mode=OneWay}"/>
                <DataGridTextColumn Header="Lot Number" Binding="{Binding JobNumber, Mode=OneWay}" />
                <DataGridTextColumn Header="Run Number" Binding="{Binding RunLabel, Mode=OneWay}" />
                <DataGridCheckBoxColumn Header="Reassay" Binding="{Binding IsReassay, Mode=OneWay}"/>
                <DataGridCheckBoxColumn Header="Standard" Binding="{Binding IsStandard, Mode=OneWay}"/>
            </DataGrid.Columns>
        </DataGrid>

А вот код C # из моей ViewModel в полном объеме:


    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LIMS.old_code;
using LIMS.Models;
using Caliburn.Micro;
using System.Windows;
using System.Windows.Input;

namespace LIMS.ViewModels
{
    class AddWeightsViewModel : Screen
    {
        public class WeightInput
        {
            public string[] MethodsArray { get; set; }
            public float WeightFloatInput { get; set; }
            public string RunLabelInput { get; set; }
            public string MethodStringInput { get; set; }
            public bool ReassayInput { get; set; }
            public bool StandardInput { get; set; }

            public WeightInput(AddWeightsViewModel context, string number, bool RA, bool Standard)
            {
                MethodsArray = EnumHelper.enumToList(context.MyCard.MethodsRequired, typeof(labMethods)).ToArray();
                WeightFloatInput = 0f;
                RunLabelInput = number;
                MethodStringInput = MethodsArray[0];
                ReassayInput = RA;
                StandardInput = Standard;
            }
        }

        public BindableCollection<Weight> Weights { get; set; }
        private ShellViewModel mySVM;
        public Card MyCard { get; set; }
        public WeightInput MyInputObj { get; set; }
        public ICommand AddButtonCommand { get; set; }

        public ICommand SelectionChangedCommand { get; set; } // to be used later
        public ICommand OnDoubleClickCommand { get; set; } // to be used later
        public Weight SelectedWeight { get; set; } // to be used later


        public AddWeightsViewModel(Card card, ShellViewModel SVM)
        {
            mySVM = SVM;
            MyCard = card;
            Weights = new BindableCollection<Weight>();
            OnDoubleClickCommand = new RelayCommand(new Action<object>(HandleOnDoubleClick));
            SelectionChangedCommand = new RelayCommand(new Action<object>(HandleSelectionChanged));
            AddButtonCommand = new RelayCommand(new Action<object>(HandleAddButton));
            MyInputObj = new WeightInput(this, "1A", false, true);

        }

        protected override void OnDeactivate(bool close)
        {
            mySVM.AddWeightsVM = null;
        }

        #region command handlers
        public void HandleSelectionChanged(object obj) // to be used later
        {
            Weight weight = (obj as Weight);
            if (weight != null)
            {
                MessageBox.Show("selection changed " + weight.JobNumber.ToString());
            }
        }
        public void HandleOnDoubleClick(object obj) // to be used later
        {
            Weight weight = (obj as Weight);
            if (weight != null)
            {
                MessageBox.Show("double click " + weight.JobNumber.ToString());
            }
        }
        public void HandleAddButton(object obj)
        {

            var w = new Weight();
            w.JobNumber = MyCard.JobNumber;
            w.IsReassay = MyInputObj.ReassayInput;
            w.IsStandard = MyInputObj.StandardInput;
            w.ChosenMethodString = MyInputObj.MethodStringInput;
            w.WeightFloat = MyInputObj.WeightFloatInput;
            w.RunLabel = MyInputObj.RunLabelInput;
            Weights.Add(w);
            MyInputObj = new WeightInput(this, "1A", false, true); 
            MessageBox.Show("commited");
        }
        #endregion
    }
}

Заранее благодарю за помощь - надеюсь, что это не такЧто-то слишком очевидное, что я пропустил - я пробовал несколько разных вещей, но безуспешно.

...