将ObservableCollection的最后一项绑定到TextBlock

时间:2014-03-14 16:15:30

标签: c# wpf windows xaml binding

我正在尝试设置一个应用程序,它允许我显示从COM端口输出的数据,所有这些都是数字。因为我还是比较新的C#,我想通过为我的类创建一些SampleData来开始:

<vm:SensorViewModel xmlns:vm="clr-namespace:MEMS_Analyzer.Content.Data">
    <vm:SensorViewModel.Items>
        <vm:SensorData  id="0" accelX="-0.154" accelY="-0.557" accelZ="0.770" gyroX="6.280" gyroY="3.902" gyroZ="-1.280" magnetoX="18.600" magnetoY="14.399" magnetoZ="45.599" airPressure="1017.095" airTemp="32.48" />
        <vm:SensorData  id="1" accelX="-0.150" accelY="-0.357" accelZ="1.270" gyroX="6.180" gyroY="4.002" gyroZ="-1.270" magnetoX="18.300" magnetoY="14.339" magnetoZ="45.500" airPressure="1016.095" airTemp="32.28" />
        <vm:SensorData  id="2" accelX="-0.164" accelY="-1.557" accelZ="0.270" gyroX="6.580" gyroY="2.902" gyroZ="-2.280" magnetoX="17.900" magnetoY="15.399" magnetoZ="40.549" airPressure="1017.790" airTemp="32.38" />
        <vm:SensorData  id="3" accelX="-1.154" accelY="-0.724" accelZ="0.218" gyroX="4.213" gyroY="3.342" gyroZ="-1.234" magnetoX="11.632" magnetoY="14.334" magnetoZ="38.523" airPressure="1017.534" airTemp="32.48" />
        <vm:SensorData  id="5" accelX="-1.987" accelY="-0.307" accelZ="1.770" gyroX="8.280" gyroY="1.902" gyroZ="-0.280" magnetoX="20.600" magnetoY="13.399" magnetoZ="40.599" airPressure="1030.095" airTemp="33.48" />
    </vm:SensorViewModel.Items>
</vm:SensorViewModel>

我设置了一个带有网格的新页面,我可以成功导航到这样:

<Grid Style="{StaticResource ContentRoot}">  
        <ScrollViewer>
            <StackPanel MinWidth="200">
                <TextBlock Text="ACCELERATION" Style="{StaticResource Heading2}" />
            </StackPanel>
        </ScrollViewer>
</Grid>

我现在的问题是我想让一个TextBlock在SensorModel中显示我的Items Collection的最后一项。我读到了有关创建自定义值转换器的信息,但是我第一次尝试使用它并没有那么顺利。将我最新的accelX,accelY和accelZ数据绑定到TextBlocks并让它们显示的最简单方法是什么?

1 个答案:

答案 0 :(得分:3)

在WPF中,我们通常只是创建我们需要的任何属性,以我们想要的方式显示数据。在您的情况下,最简单的方法是将您的集合中的最后一项作为代码中的属性公开(当然,您还需要在那里定义您的集合):

public SensorData LastItem
{
    get { return SensorDataCollection.Last(); }
}

public ObservableCollection<SensorData> SensorDataCollection
{
    get { return sensorDataCollection; }
    set
    {
        sensorDataCollection = value;
        NotifyPropertyChanged("SensorDataCollection"); // <-- INotifyPropertyChanged
        NotifyPropertyChanged("LastItem"); // <-- Notify LastItem change here too
    }
}

...

<TextBlock Text="{Binding LastItem}" />