[英]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.