繁体   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