如何在Silverlight中使用MVVM模式绑定自定义事件,而不使用Blend?
我正在开发一个涉及图表控件的Silverlight项目 我正在使用图表控件&在它的系列中,我实现了左键单击上下文菜单,它有两个菜单项,即。展开并钻取如何在Silverlight中使用MVVM模式绑定自定义事件,而不使用Blend?,silverlight,binding,silverlight-4.0,mvvm,commandbinding,Silverlight,Binding,Silverlight 4.0,Mvvm,Commandbinding,我正在开发一个涉及图表控件的Silverlight项目 我正在使用图表控件&在它的系列中,我实现了左键单击上下文菜单,它有两个菜单项,即。展开并钻取 public class WebChart : Chart { ContextMenu ChartItemDataMenu; public WebChart() : base() { this.Loaded += new RoutedEventHandler(WebChart_Loade
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;
}
但是在调试代码时,我得到ExpandClickEvent&DrillClickEvent为null,因为没有人在监听它
我在另一个名为ChartBaseControl的用户控件中使用这个WebChart控件,而这个用户控件又在另一个名为Graph Control的用户控件中使用。
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>
我找到了问题的答案 我没有使用自定义事件处理程序,而是使用路由事件处理程序,因为事件在页面之间路由 为了将我的自定义参数发送到ViewModel,我创建了一个名为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
});
}
}
}
您的代码中有一些奇怪之处,但没有任何东西可以作为空事件的原因。您还可以提供应该侦听事件的控件的Xaml吗?
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
});
}
}
}