2017-02-07 2 views
-1

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; 
} 
+0

Просто сидение - включите только код, который имеет отношение к вашему вопросу, что упрощает вам быстрый ответ. Чтобы подтвердить: хотите ли вы, чтобы событие PropertyChanged также вызывало метод OnDataAnalyzed, который у вас есть? Или вы хотите добавить метод как отдельный обработчик событий? – prestonsmith

+0

Спасибо за подсказку. Предпочтительным является добавление метода в качестве отдельного обработчика событий. Я нашел обходное решение, и я не уверен, что он (см. Ответ) более идеален или что вы имеете в виду. –

ответ

0

Я не уверен, если мое ниже решение идеально подходит или нет. Возможно, кто-то может прокомментировать это и/или альтернативное решение. Благодаря

public void OnDataAnalyzed(string data, int channelNumber) 
    { 
     // MessageBox.Show("Analyzed"); 
     Data.Clear(); 
     Data.Add(new MyData() { Year = 1, Value = Convert.ToInt32(data.Substring(7, 2)), WorkType = WorkTypes.Violet }); 

     Application.Current.Dispatcher.BeginInvoke(
       DispatcherPriority.Normal, 
       new Action(() => BarChart1.CanChangeLegendVisibility = true)); 
    } 
0

Там два пути, чтобы подойти к этому, один, чтобы изменить обработчик событий и добавить его в событие так:

public void OnDataAnalyzed(object sender, PropertyChangedArgs args) 
{ 
    // whatever you do 
} 

PropertyChanged += OnDataAnalyzed; 

Проблема здесь, что вам не хватает на параметры что вы в настоящее время назначили для своего метода, может не быть в PropertyChangedArgs (я не могу найти его структуру в вашем коде). Я не уверен, где эти параметры вписываются, потому что в обоих примерах так много кода - если вы можете сократить его до самых релевантных вещей, я могу дать вам больше отзывов?

+0

Параметры передаются из другого объекта с другой подписью, как вы можете видеть. Я не уверен, поможет ли этот код, но я добавил его к моему вопросу. –

Смежные вопросы