【问题标题】:Telerik RadGauge + Data BindingTelerik RadGauge + 数据绑定
【发布时间】:2012-07-25 03:48:55
【问题描述】:

所以我正在尝试更新我的 RadRadialGauge。它将显示实时检索的数据(使用动画针)。我有一个 RadChartView,目前使用 TimeStampValue 属性来绘制图表。当我添加图表时,有时我可能想根据我正在观察的变量添加一些图表。例如,如果我想查看电机速度和输出频率,我必须添加多个垂直轴。我处理 RadChartView 数据绑定的部分代码在这里:

var lineSeries = new LineSeries();
lineSeries.CategoryBinding =
    new PropertyNameDataPointBinding() { PropertyName = "TimeStamp" };
lineSeries.ValueBinding =
    new PropertyNameDataPointBinding() { PropertyName = "Value" };
lineSeries.ItemsSource = (chart.Chart as GuiAnalogQueue).Records;

其余代码只是外观处理,最后我将 LineSeries 添加到我的 RadChartView。

现在,我正试图以某种方式将此代码移植到 RadGauge。我不确定如何将值绑定到 Needle,以便在值更改时针会移动。
在 XAML 中,我尝试过 Value="{Binding Value}" 我尝试将绑定添加到 ValueSource 变量。我也做过needle.Value = chart.Chart.Value;

我不知道,所以任何帮助表示赞赏。

更新

这就是我想要完成的。我的Records 集合有两个属性,ValueTimeStamp。我正在尝试将Records 中的Value 绑定到needle 值。这是我以编程方式执行此操作的方法:

public void InitializeCharts(ChartsVM charts, Theme theme)
{
    DataContext = charts;
    foreach (cVM chart in charts.Charts)
    {
        Binding value = new Binding();
        value.Source = (chart.Chart as GuiAnalogQueue).Records;
        value.Path = new PropertyPath("Value");
        needle.SetBinding(Needle.ValueProperty, value);
    } 
}

但是,当我这样做时,它根本不会更改 needle.Value。我的 Records 是使用 NotifyPropertyChanged("Records") 的集合,所以我希望每次更改 Records 时我的针都会改变。

正如您在我的原始帖子中看到的,这三行负责将变量绑定到 ChartView 图表,但是我无法让 RadGauge 工作。

【问题讨论】:

    标签: c# wpf data-binding mvvm telerik


    【解决方案1】:

    简而言之,我发现 Needle 的值不使用任何类型的集合。因此,当我尝试将 Source 设置为集合内部和 Path 时,它并不是真的喜欢那样。相反,我在将值添加到记录集合之前添加了一个属性(在我的更新值函数中)。这样我就可以将绑定设置为:

    Binding value = new Binding();         
    value.Source = (chart.Chart as GuiAnalogQueue);         
    value.Path = new PropertyPath("AnalogValue");
    needle.SetBinding(Needle.ValueProperty, value); 
    

    也就是说,Needle 会将其 Value 属性与 Source--chart.Chart 中的 AnalogValue 属性绑定为 GuiAnalogQueue。

    如果您已被引导至此页面,希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      这是使用 RadRadialGauge 的基本示例。


      XAML:


      <telerik:RadRadialGauge x:Name="radialGauge"
                          Width="300"
                          Height="300"
                                      Grid.Column="0">
              <telerik:RadialScale Min="1"
                              Max="12">
                  <telerik:RadialScale.Indicators>
                      <telerik:Needle x:Name="needle" />
                      <telerik:Pinpoint/>
                  </telerik:RadialScale.Indicators>
      
              </telerik:RadialScale>
          </telerik:RadRadialGauge>
      

      如您所见,我有一个定义了径向刻度的径向量规。径向刻度有一根针作为指示器。 RadialScale 是从 1 到 12。请注意,我已经给针起了一个名字。我们将使用它从后面的代码中推送值。

      在此示例中,我使用调度程序计时器每 1 秒计时一次,并生成一个介于 1 到 12 之间的随机值。这是 sn-ps 背后的代码。


      代码 sn-p:


      以下变量在窗口级别声明

      TimeSpan interval = TimeSpan.FromSeconds(1);
      DispatcherTimer timer;
      Random rnd = new Random();
      

      我已经为 Window Loaded & Unloaded 事件定义了事件处理程序。在窗口加载时,我启动计时器。

          void OnWindowLoad(object sender, RoutedEventArgs e)
          {
              timer = new DispatcherTimer();
              timer.Interval = interval;
              timer.Tick += new EventHandler(Timer_Tick);
              timer.Start();
          }
      

      这里是定时器滴答功能:

          private void Timer_Tick(object sender, EventArgs e)
          {
              timer.Stop();
      
              SetNextValue();
      
              timer.Start();
          }
      

      这里是 SetNextValue 函数:

          private void SetNextValue()
          {
              int minValue = 1;
              int maxValue = 12;
              int nextValue = rnd.Next(minValue, maxValue);
              needle.Value = nextValue;
          }
      

      在 Unloaded 事件处理程序中,我正在停止计时器。

          void OnWindowUnload(object sender, RoutedEventArgs e)
          {
              timer.Stop();
          }
      

      输出: 当您运行应用程序时,您会看到针的位置发生变化,因为我们每秒生成从 1 到 12 的随机数,并且我们将生成的数字设置为针的值。 SetNextValue() 方法可以成为您监控真实值并将针值设置为真实数据的网关。

      这是我能想到的用于解释径向量规的基本示例代码。

      希望这能提供您正在寻找的答案。


      更新:


      这里是一种设置指针值的 MVVM 方式。让窗口实现 INotifyPropertyChanged 接口。将数据上下文设置为窗口本身

      public partial class MainWindow : Window, INotifyPropertyChanged
      
      public MainWindow()
          {
              InitializeComponent();
      
              Loaded += OnWindowLoad;
              Unloaded += OnWindowUnload;
      
              DataContext = this;
          }
      

      为 PropertyChanged 事件提供实现,如下所示:

      public event PropertyChangedEventHandler PropertyChanged = delegate { };
      
          void NotifyPropertyChanged(string propName)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(propName));
          }
      

      实现一个名为 NeedleValue 的属性。

          int needleValue = 1;
          public int NeedleValue 
          {
              get
              {
                  return needleValue;
              }
              set
              {
                  needleValue = value;
                  NotifyPropertyChanged("NeedleValue");
              }
          }
      

      在 SetNextValue - 只需设置新创建的 NeedleValue 属性。这将触发属性更改通知。

      private void SetNextValue()
          {
              int minValue = 1;
              int maxValue = 12;
              int nextValue = rnd.Next(minValue, maxValue);
              NeedleValue = nextValue;
          }
      

      在 XAML 中,将 Needle Value 属性绑定到 NeedleValue,如下所示

      <telerik:Needle x:Name="needle" Value="{Binding NeedleValue}" />
      

      希望这能为您提供您正在寻找的答案:)

      Lohith(Telerik India 技术传播者)

      【讨论】:

      • 我是否需要使用 SetNextValue 函数才能对其进行更新?就像我说的那样,我尝试做 Value={"Binding Value"} 就像我对 RadChartView 所做的那样,但它没有改变,即使我知道 Value NotifyProp.Changed 正在被解雇。是否有 ItemsSource 或我必须设置的任何内容?
      • 请检查更新的答案。我提供了设置针值的 MVVM 方式。
      • 我觉得我们越来越近了,这当然是如何做到的。但是我的数据不是这样设置的。我有这个电话:(chart.Chart as GuiAnalogGui).Records,它返回RangeObservblColction&lt;GuiRecord&lt;double&gt;&gt;(基本上是一个List>>)。 GuiRecord&lt;double&gt; 具有 ValueTimeStamp 属性。我需要针 = 记录中的值。每次实时数据更新时,都会创建一个新的 GuiRecord 并将其放入 Records 集合中。我不太确定这是否足够清楚,但如果您需要澄清,请问。
      猜你喜欢
      • 2013-07-02
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多