【问题标题】:How to bind custom Events in Silverlight using MVVM Pattern w/o using Blend?如何使用 MVVM 模式在 Silverlight 中绑定自定义事件而不使用 Blend?
【发布时间】:2011-10-13 05:22:16
【问题描述】:

我正在开发一个涉及图表控件的 Silverlight 项目。

我正在使用图表控件,在其系列中我实现了左键单击上下文菜单,它有两个菜单项,即。 “展开”和“钻取”。

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 控件,该控件又在另一个名为 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>

【问题讨论】:

  • 您的代码中有一些奇怪的地方,但没有任何内容可以作为空事件的原因。您是否还可以提供应该监听事件的控件的 Xaml?

标签: silverlight binding silverlight-4.0 mvvm commandbinding


【解决方案1】:

我找到了问题的答案。

我没有使用自定义事件处理程序,而是使用路由事件处理程序,因为事件在页面之间路由。

为了将我的自定义参数发送到 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
            });
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2011-11-05
    相关资源
    最近更新 更多