0

我正在尝试开发一个应用程序,我想在每三秒后生成一个随机数,将该数字插入列表框并使用 DataTemplate 将列表框显示为矩形。

是供参考。

现在的问题是我使用了一个 DispatcherTimer,它在 3 秒后“滴答”,但矩形没有更新。

我正在发布我的 XAML 和 .cs 代码。有什么提示吗?

namespace ListBarGraph
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {
        DispatcherTimer dt = new DispatcherTimer();
        DataFactory df = new DataFactory();

        public MainWindow()
        {
            InitializeComponent();
            dt.Tick += new EventHandler(dt_Tick);
            dt.Interval = new TimeSpan(0, 0, 3);
            dt.Start();

            this.PreviewKeyDown += new KeyEventHandler(MainWindow_PreviewKeyDown);
        }

        void dt_Tick(object sender, EventArgs e)
        {
            df.GetData();
        }
    }

    public class DataFactory
    {
        int number = 0;

        public IEnumerable<int> GetData()
        {
            Random random = new Random();
            number = random.Next(0, 100);
            return new int[] { 0, number };
        }
    }
}




<Window x:Class="ListBarGraph.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListBarGraph"
        Title="MainWindow" Height="350" Width="525">

   <Window.Resources>

       <ObjectDataProvider x:Key="someData" ObjectType="{x:Type local:DataFactory}" MethodName="GetData" />

      <DataTemplate x:Key="BarChartItemsTemplate">
         <Border Width="300" Height="50">
            <Grid>
               <Rectangle Fill="Red" StrokeThickness="2" Height="40" Width="{Binding}" HorizontalAlignment="Right" VerticalAlignment="Bottom">
                  <Rectangle.LayoutTransform>
                     <ScaleTransform ScaleX="1.5"/>
                  </Rectangle.LayoutTransform>
               </Rectangle>
         </Grid>
         </Border>
      </DataTemplate>

      <ItemsPanelTemplate x:Key="BarChartItemsPanel">
         <VirtualizingStackPanel IsItemsHost="True">
            <VirtualizingStackPanel.LayoutTransform>
               <TransformGroup>
                  <RotateTransform Angle="90"/>
                  <ScaleTransform ScaleX="-1" ScaleY="1"/>
               </TransformGroup>
            </VirtualizingStackPanel.LayoutTransform>
         </VirtualizingStackPanel>
      </ItemsPanelTemplate>

 </Window.Resources>

   <Grid>
      <ListBox ItemsSource="{Binding Source={StaticResource someData}}" ItemTemplate="{DynamicResource BarChartItemsTemplate}" ItemsPanel="{DynamicResource BarChartItemsPanel}"/>

   </Grid>

</Window>
4

1 回答 1

0

您的 XAML 绑定到由 .DataFactory创建的一个实例ObjectProvider,而您的代码隐藏完全创建另一个实例,UI 未绑定到该实例。

试试这个让你开始。在您的 XAML 中,删除ObjectProvider并将您的更改ListBox为:

<ListBox ItemsSource="{Binding}" ...

在里面dt_Tick,这样做:

this.DataContext = df.GetData();
于 2012-08-02T06:04:30.517 回答