Я новичок в 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
}
}
Заранее благодарю за помощь - надеюсь, что это не такЧто-то слишком очевидное, что я пропустил - я пробовал несколько разных вещей, но безуспешно.