WPF Chart Control успешно добавляет и очищает данные и обновляет диаграмму при переключении флажка, поскольку он включает в себя «UpdateSourceTrigger = PropertyChanged», однако я не уверен, как запускать одно и то же событие в коде позади метода OnDataAnalyzed (строковые данные, int channelNumber).Как сгенерировать событие PropertyChanged в таблице WPF
public partial class MainWindowChart : Window
{
public MainWindowChart()
{
InitializeComponent();
this.DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
public void OnDataAnalyzed(string data, int channelNumber)
{
//Code needed to trigger PropertyChanged event that updates BarChart1.
}
}
MainWindowChart.xaml
<Window x:Class="WPFControlTester.MainWindowChart"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="589" Width="1008"
xmlns:controls="clr-namespace:KeyhanControls.Chart;assembly=KeyhanControls"
xmlns:my="clr-namespace:WPFControlTester">
<Window.Resources>
<my:Bool2Visibility x:Key="B2V"/>
</Window.Resources>
<Grid>
//Code removed for simplicity...
<controls:BarChart x:Name="BarChart1" LegendPropertyName="WorkType" VerticalPropertyName="Value" HorizontalPropertyName="Year" FontFamily="Tahoma"
ItemsSource="{Binding Path=Data, RelativeSource={RelativeSource AncestorType=Window}}">
//Code removed for simplicity...
</controls:BarChart>
<Border Grid.Column="1" BorderBrush="DarkGray" BorderThickness="1" Margin="10">
<StackPanel Margin="5">
<CheckBox Content="Can change bars visibility" IsChecked="{Binding Path=CanChangeLegendVisibility, ElementName=BarChart1, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Border>
</Grid>
</Window>
имен KeyhanControls.Chart
[System.ComponentModel.DefaultProperty("Legends")]
public partial class BarChart : UserControl
{
public BarChart()
{
InitializeComponent();
this.DataContext = this;
}
//Code removed for simplicity...
public static readonly DependencyProperty CanChangeLegendVisibilityProperty = DependencyProperty.Register("CanChangeLegendVisibility", typeof(bool), typeof(BarChart),
new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (s, e) => { (s as BarChart).CanChangeLegendVisibility = (bool)e.NewValue; }));
public bool CanChangeLegendVisibility
{
get
{
return (bool)GetValue(CanChangeLegendVisibilityProperty);
}
set
{
SetValue(CanChangeLegendVisibilityProperty, value);
Notify("CanChangeLegendVisibility");
Draw();
}
}
//Code removed for simplicity...
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
//Code removed for simplicity...
}
[System.ComponentModel.DefaultEvent("IsVisibleChanged")]
[System.ComponentModel.DefaultProperty("LegendType")]
public class Legend : DependencyObject, INotifyPropertyChanged
{
//Code removed for simplicity...
private bool _isVisible = true;
public bool IsVisible
{
get { return _isVisible; }
set
{
if (_isVisible != value)
{
_isVisible = value;
Notify("IsVisible");
if (IsVisibleChanged != null)
IsVisibleChanged(this, new RoutedEventArgs());
}
}
}
public event RoutedEventHandler IsVisibleChanged;
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
// Ниже код ближе к данным и источника параметров номер_канала
clsAnalysis.cs
public delegate void dlgAnalysis_Analyzed(string data, int channelNumber);
public event dlgAnalysis_Analyzed analysis_Analyzed;
clsCommand.cs
private void Analysis_DataAnalyzed(string data, int channelNumber)//Fired from the analysis module.
{
transmitData(channelNumber, data);
}
public void newClientSelected(clsLVI_Generic_Item item)
{
analysisModule = new clsAnalysis(SENSOR_DELIMITER, wMain.cSettings.SensitiveAnalysisMode)
hookAnalysisEvents();
}
private void hookAnalysisEvents()
{
analysisModule.analysis_Analyzed += wChart.OnDataAnalyzed;
}
Просто сидение - включите только код, который имеет отношение к вашему вопросу, что упрощает вам быстрый ответ. Чтобы подтвердить: хотите ли вы, чтобы событие PropertyChanged также вызывало метод OnDataAnalyzed, который у вас есть? Или вы хотите добавить метод как отдельный обработчик событий? – prestonsmith
Спасибо за подсказку. Предпочтительным является добавление метода в качестве отдельного обработчика событий. Я нашел обходное решение, и я не уверен, что он (см. Ответ) более идеален или что вы имеете в виду. –