2011-10-13 59 views
0

我正在開發一個涉及圖表控件的Silverlight項目。如何使用MVVM綁定Silverlight中的自定義事件模式不使用Blend?

我在其系列上使用圖表控件&我實現了左鍵上下文菜單,它有兩個MenuItems, 「展開」&「鑽取」。

public class WebChart : Chart 
{ 
    ContextMenu ChartItemDataMenu; 

    public WebChart() 
     : base() 
    { 
     this.Loaded += new RoutedEventHandler(WebChart_Loaded); 
    } 

    private void WebChart_Loaded(object sender, RoutedEventArgs e) 
    { 
     MenuItem expand = new MenuItem(); 
     expand.Click += new RoutedEventHandler(OnExpand_Click); 
     ToolTipService.SetToolTip(expand, "Expand"); 

     MenuItem drill = new MenuItem(); 
     drill.Click += new RoutedEventHandler(OnDrill_Click); 
     ToolTipService.SetToolTip(drill, "Drill"); 

     ChartItemDataMenu = new ContextMenu(); 

     ChartItemDataMenu.Items.Add(expand); 
     ChartItemDataMenu.Items.Add(drill); 

     this.DataItemMouseLeftButtonDown += 
      new EventHandler<DataItemMouseEventArgs>(ExtendedXamWebChart_DataItemMouseLeftButtonDown); 

     this.MouseRightButtonDown -= (s, eventArgs) => { eventArgs.Handled = true; }; 
     this.MouseRightButtonDown += (s, eventArgs) => { eventArgs.Handled = true; }; 
    } 

    private void ExtendedXamWebChart_DataItemMouseLeftButtonDown(object sender, DataItemMouseEventArgs e) 
    { 
     ChartItemDataMenu.IsOpen = true; 
    } 

對於這兩個菜單項我已經宣佈獨立的點擊事件,註冊他們養他們。 然後我將XAML中的這些事件綁定到視圖模型中的ICommand屬性。

public delegate void WebChartEventHandler(object sender, DataItemMouseEventArgs e, DataPoint dp, qcPoint qp); 

    public event WebChartEventHandler ExpandClickEvent; 
    public event WebChartEventHandler DrillClickEvent; 

    private void OnDrill_Click(object sender, RoutedEventArgs e) 
    { 
     if (currentDataItemMouseEventArgs == null) 
      currentDataItemMouseEventArgs = new DataItemMouseEventArgs(); 
     if (DrillClickEvent != null) 
     { DrillClickEvent(sender, currentDataItemMouseEventArgs, SelectedDataPoint, CurrentSelectedPoint); } 
    } 

    private void OnExpand_Click(object sender, RoutedEventArgs e) 
    { 
     if (currentDataItemMouseEventArgs == null) 
      currentDataItemMouseEventArgs = new DataItemMouseEventArgs(); 
     if (ExpandClickEvent != null) 
     { ExpandClickEvent(sender, currentDataItemMouseEventArgs, SelectedDataPoint, CurrentSelectedPoint); } 
    } 
} 

但在調試代碼,我得到「ExpandClickEvent」 &「DrillClickEvent」爲空,因爲沒有人聽吧。

我在另一個名爲ChartBaseControl的用戶控件中使用此WebChart控件,而該控件又在名爲圖形控件的另一個用戶控件中使用。 DataContext已正確設置。 我創建了一個名爲ViewModelGraphControl的ViewModel。

我相信有一些我失蹤了。 請照顧問題。

編輯的內容:XAML:

<extnchart:WebChart Grid.Row="0" x:Name="CTRLWebChart" VerticalAlignment="Stretch" 
              Margin="0,-23,0,0" IsDrillEnable="True" 
              local:AxisTitleSettings.XAxisTitle="X-Axis" 
              local:AxisTitleSettings.YAxisTitle="Y-Axis" 
ChartSeriesCollection="{Binding WebChartSource, Mode=TwoWay}"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="DrillClickEvent"> 
         <command:EventToCommand Command="{Binding OnDrill_Click}"  PassEventArgsToCommand="True"/> 
        </i:EventTrigger> 
        <i:EventTrigger EventName="ExpandClickEvent"> 
         <command:EventToCommand Command="{Binding OnExpand_Click}"  PassEventArgsToCommand="True"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
       <extnchart:ExtendedXamWebChart.Axes> 
        <igWebChart:Axis AxisType="PrimaryX"> 
         <igWebChart:Axis.Label> 
          <igWebChart:LabelGroup DistanceFromAxis="2"/> 
         </igWebChart:Axis.Label> 
        </igWebChart:Axis> 
        <igWebChart:Axis AxisType="PrimaryY"> 
         <igWebChart:Axis.Label> 
          <igWebChart:LabelGroup FontSize="11"/> 
         </igWebChart:Axis.Label> 
        </igWebChart:Axis> 
       </extnchart:ExtendedXamWebChart.Axes> 
      </extnchart:ExtendedXamWebChart> 
+0

有在你的代碼有些古怪的地方,但沒有什麼跳出作爲無效事件的原因。你是否也可以提供應該監聽事件的控件的Xaml? –

回答

0

我找到了答案查詢。

而不是使用自定義事件處理程序,因爲事件在頁面之間路由,所以我使用了路由事件處理程序。

而且爲了送我的自定義參數到視圖模型,我創建了一個新的命名ExtendedRoutedEventArgs類和繼承了它自RoutedEventArgs類和創造領域&性質,我想訪問。

public class ExtendedRoutedEventArgs : RoutedEventArgs 
    { 
     public ExtendedRoutedEventArgs() 
      : base() 
     { 

     } 
     private DataItemMouseEventArgs currentDataItemMouseEventArgs; 

     public DataItemMouseEventArgs CurrentDataItemMouseEventArgs 
     { 
      get { return currentDataItemMouseEventArgs; } 
      set { currentDataItemMouseEventArgs = value; } 
     } 

     private DataPoint selectedDataPointe; 

     public DataPoint SelectedDataPointe 
     { 
      get { return selectedDataPointe; } 
      set { selectedDataPointe = value; } 
     } 

     private qcPoint currentSelectedQcPoint; 

     public qcPoint CurrentSelectedQcPoint 
     { 
      get { return currentSelectedQcPoint; } 
      set { currentSelectedQcPoint = value; } 
     } 
    } 

接下來,我舉起事件以下列方式:

public class WebChart : Chart 
{ 
    void OnDrill_Click(object sender, RoutedEventArgs e) 
    { 
     if (currentDataItemMouseEventArgs == null) 

      currentDataItemMouseEventArgs = new DataItemMouseEventArgs(); 
     if (DrillClickEvent != null) 
     { 
      DrillClickEvent(sender, new ExtendedRoutedEventArgs 
      { 
       CurrentDataItemMouseEventArgs = currentDataItemMouseEventArgs, 
       SelectedDataPointe = SelectedDataPointe, 
       CurrentSelectedQcPoint = CurrentSelectedQcPoint 
      }); 
     } 
    } 
} 
相關問題