簡體   English   中英

如何在 UI 中的屬性更改時引發事件

[英]How to raise an event when a Property changes in the UI

我會盡力詳細解釋我正在嘗試做的事情。

我在 WPF 項目中使用 Caliburn.Micro 框架。 我有一個名為 DataModel 的 Model Class 有兩個屬性,Tag 是一個字符串,DataValues 是一個雙值列表:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WPFUI.Models
{
    public class DataModel
    {
        public string Tag { get; set; }
        public List<double> DataValues { get; set; }
    }
}

我在視圖中添加了 Combobox,其中的項目是 DataModel Class 的一些創建對象的所有標簽,作為 ViewModel 中的 BindableCollection 屬性:

private BindableCollection<DataModel> _data = new BindableCollection<DataModel>();

public BindableCollection<DataModel> Data
        {
            get { return _data; }
            set { _data= value; }
        }

在用戶界面中:

<ComboBox x:Name="Data" DisplayMemberPath="Tag" />

BindableCollection 是從 DataTable 的每個 DataColumn 生成的(表的每一列都是 object,其中 Header 是字符串類型的 Tag 屬性,行值是 List 類型的 DataValues 屬性)。

我正在尋找的是在 ViewModel 中創建一個名為 SelectedData 的屬性,它將 Combobox 中的選擇更改通知給 ViewModel,然后訪問 SelectedItem 的 DataValues 屬性以將該列表傳遞給圖表值(我正在使用LiveCharts ) 設置鏈接到 UI 的 SeriesCollection 屬性。

像這樣的東西:

private DataModel _selectedData;
public DataModel SelectedData
        {
            get { return _selectedData; }
            set
            {
                _selectedData= value;
                NotifyOfPropertyChange(() => SelectedData);
            }
        }

// Code to handle the DataObject selected in the Combobox 
SeriesCollection = new SeriesCollection
        {
            new LineSeries
            {
                Title = DataObject.Tag,
                Values = DataObject.DataValues.AsChartValues() // LiveCharts
            },
        };
//

public SeriesCollection SeriesCollection { get; set; }

注意: SeriesCollection 必須實現 NotifyPropertyChanged 才能通知 UI 屬性的變化。

概括

換句話說,我要做的是通知源 UI 中的屬性更改,然后在 ViewModel 中操作 DataObject(使用 Combobox 的 SelectedItem 定義)以在 UI 中顯示新數據(通知更改在 SeriesCollection 屬性中)。

我該怎么做才能做到這一點?

編輯

如果存在具有 FirstName 和 LastName 屬性的 PersonModel Class 而不是 DataModel Class,則可以在視圖中執行以下操作:

<ComboBox Grid.Row="3" Grid.Column="1" x:Name="People"
                  SelectedItem="{Binding Path=SelectedPerson, Mode=OneWayToSource}"
                  DisplayMemberPath="FirstName" />
        <TextBlock Grid.Row="3" Grid.Column="2" x:Name="SelectedPerson_LastName" />

在 ViewModel 中:

public BindableCollection<PersonModel> People
        {
            get { return _people; }
            set { _people = value; }
        }

        public PersonModel SelectedPerson
        {
            get { return _selectedPerson; }
            set
            {
                _selectedPerson = value;
                NotifyOfPropertyChange(() => SelectedPerson);
            }
        }

然后,每當您更改 Combobox 的選擇時,TextBlock 的文本將由於以下行而更新:

<TextBlock Grid.Row="3" Grid.Column="2" x:Name="SelectedPerson_LastName" />

其中 LastName 屬性綁定在x:Name="SelectedPerson_LastName"

我正在嘗試實施類似的方法,但我不能直接使x:Name="SelectedData_DataValues"來更新圖表。 相反,我需要設置 SeriesCollection 屬性,使用 SelectedData.Datavalues 屬性設置值。 但這正是我不知道該怎么做的。

好吧,我終於明白了:

private DataModel _selectedData;

public DataModel SelectedData
        {
            get { return _selectedData; }
            set
            {
                _selectedData = value;
                NotifyOfPropertyChange(() => SelectedData);

                if (SelectedData != null)
                {
                    SeriesCollection = new SeriesCollection
                    {
                        new LineSeries
                        {
                            Title = SelectedData.Tag,
                            Values = SelectedData.DataValues.AsChartValues()
                        },
                    };
                }  
            }
        }

在 XAML 查看:

<ComboBox Grid.Row="1" Grid.Column="1" Width="100" x:Name="Data"
                  SelectedItem="{Binding Path=SelectedData, Mode=OneWayToSource}"
                  DisplayMemberPath="Tag" />

現在 SeriesCollection 屬性必須實現 NotifyPropertyChanged:

private SeriesCollection _seriesCollection;

public SeriesCollection SeriesCollection
        {
            get { return _seriesCollection; }
            set {
                    _seriesCollection = value;
                    NotifyOfPropertyChange(() => SeriesCollection);
                }
        }

在 XAML 查看:

<lvc:CartesianChart Series="{Binding SeriesCollection}">

沒有寶貴的幫助,我無法做到。 感謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM