3

所以我正在尝试更新我的 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。我不确定如何将值绑定到针,以便在值更改时针移动。
在我尝试过的 XAML 中,我Value="{Binding Value}"尝试向ValueSource变量添加绑定。我也做过needle.Value = chart.Chart.Value;

我无法弄清楚,所以任何帮助表示赞赏。

更新

这就是我想要完成的。我的Records收藏有两个属性,ValueTimeStamp. 我正在尝试将我的值绑定ValueRecordsneedle。这是我以编程方式执行此操作的方法:

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。MyRecords是使用 NotifyPropertyChanged("Records") 的集合,所以我希望每次更改 Records 时我的针都会改变。

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

4

2 回答 2

3

简而言之,我发现 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。

如果您被引导到此页面,希望这会有所帮助。

于 2012-08-01T16:34:31.237 回答
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 之间的随机值。这是代码片段背后的代码。


代码片段:


以下变量在窗口级别声明

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 (Tech Evangelist, Telerik India)

于 2012-07-26T19:19:48.137 回答