Как получить объект списка после обновления свойства объекта в ListView - PullRequest
0 голосов
/ 24 января 2019

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

Я попытался создать объект класса и привязать его к SelectedItem в ListView.Проблема в том, что, очевидно, SelectedItem устанавливается после щелчка по строке ListItem, но не по дочерним элементам этой строки.Мне нужно получать обновленный объект из строки моего ListView каждый раз после изменения значений ComboBox или TextBox.

Для обработки всех вещей с INotifyPropertyChanged я использую PropertyChanged.Fody.Может ли это помочь мне решить эту проблему проще?

Просмотр

Внешний вид ListView

<ListView 
        Margin="10"
        Grid.Row="1"
        Grid.ColumnSpan="2"
        ItemsSource="{Binding TimesheetEntries}"
        SelectedItem="{Binding SelectedEntry, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
        >
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Height="30" Margin="3">
                    <TextBlock 
                        Text="{Binding Date, StringFormat=dd-MM-yyyy}" 
                        VerticalAlignment="Center" 
                        Width="Auto" 
                        Margin="10"/>
                    <ComboBox 
                        SelectedValuePath="Key" DisplayMemberPath="Value" 
                        ItemsSource="{Binding EmploymentTypesDictionary, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                        SelectedValue="{Binding SelectedEmployment, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                        Width="270"/>
                    <TextBox 
                        Text="{Binding Hours, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                        Margin="10,0,0,0"
                        Width="70"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

ViewModel

public List<TimesheetEntryEntity> TimesheetEntries
{
    get { return _TimesheetEntries; }
    set { _TimesheetEntries = value; }
}

public TimesheetEntryEntity SelectedEntry
{
    get { return _SelectedEntry; }
    set { _SelectedEntry = value; }
}

...

private List<TimesheetEntryEntity> _TimesheetEntries { get; set; }
private TimesheetEntryEntity _SelectedEntry;
private TimesheetModel timesheetModel;
public TimesheetViewModel()
{
        this.Timesheets = TimesheetUnitModel.GetAllTimesheetsForUnit((int)Application.Current.Properties["UnitID"]);
        this._StartDate = DateTime.Now;
        _TimesheetEntries = new List<TimesheetEntryEntity>();
}
public KeyValuePair<int, string> SelectedWorker
{
    get { return _SelectedWorker; }
    set
    {
        _SelectedWorker = value;
        _TimesheetEntries =
                timesheetModel.GetTimesheetList(_SelectedWorker.Key, SelectedTimesheet.Key, StartDate.Date);
    }
}

TimesheetEntryEntity

    public DateTime Date { get; set; }

    public Dictionary<EmploymentTypes, string> EmploymentTypesDictionary { get; set; }

    public EmploymentTypes SelectedEmployment {
        get { return _SelectedEmployment; }
        set
        {
            _SelectedEmployment = value;
            CheckHoursAvaliability();
        }
    }
    public bool HoursAvaliable { get; set; }

    public decimal Hours
    {
        get;
        set;
    }
    private EmploymentTypes _SelectedEmployment;

    public TimesheetEntryEntity()
    {
        FillEmploymentTypes();
    }

    public void FillEmploymentTypes()
    {
        //Some code here
    }

Я пытался ответить на вопрос от Получить свойства объекта выбранного элемента списка вопрос, но были только текстовые блоки, поэтому строка все равно выбирается, но у меня есть ComboBox и TextBox, которые получают свой фокус.

1 Ответ

0 голосов
/ 24 января 2019

Вы можете реализовать INotifyPropertyChanged в вашем TimesheetEntryEntity, т.е.

public abstract class TimesheetEntryEntity: INotifyPropertyChanged
{
    public event EventHandler Changed;
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public void OnChange()
    {
        EventHandler handler = Changed;
        handler?.Invoke(this, EventArgs.Empty);
    }
    private DateTime date;
    public DateTime Date
    {
        get => date;
        set
        {
            if (date == value)
            {
                return;
            }
            //Do something with unchanged property
            date = value;
            RaisePropertyChanged();
            OnChange();
            //Do something with changed property
        }
    }

в вашей ViewModel, прежде чем добавлять новый элемент в список:

   timesheet.Changed+=ItemChanged;

и

 private void ItemChanged(object sender, EventArgs e)
    {
       var item=sender as TimesheetEntryEntity;
       //do something    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...