在设计时需要Mock XAML数据

时间:2009-11-20 08:31:24

标签: c# wpf xaml

我正在使用XAML中定义的静态对象数组作为列表框中的ItemsSource。

我用:

ItemsSource="{Binding Source={StaticResource theSource}}".

这在设计时非常有用。但是,我需要在运行时覆盖它,因此列表框将从我的视图模型上的集合属性中获取它的项目。我公开了一个名为“theSource”的属性,并在后面的代码中设置Window DataContext。但是,列表仍然绑定到静态资源...而不是我视图模型上的属性。

有关正确设置时间数据以便在运行时可视化UI并替换实时数据的建议吗?

1 个答案:

答案 0 :(得分:0)

只需命名列表框控件

即可
<ListBox x:Name="myListBox" 
 ItemsSource="{Binding Source={StaticResource theSource}}" />

并在运行时更改

myListBox.ItemsSource = datasource;

第二个解决这个问题:

What's the difference between StaticResource and DynamicResource in WPF?

如果您正在使用WPF,那么您可以使用DynamicResource代替,并在运行时更改此定义

但是Silverlight会失败,因为这个较轻的框架不支持动态资源。


第三次

由于您想对控制器对象使用绑定,因此:

<Page xmlns="http://..." xmlns:your="...">
<Page.DataContext>
  <your:DesignTimeObject> <!-- Must be of the same type as in runtime, or at least expose properties and subproperties with the same name -->
   <your:DesignTimeObject.List>
    <your:Element id="1" />
     <your:Element id="2" />
     <!-- snip -->
   <your:DesignTimeObject.List>
  </your:DesignTimeObject>
</Page.DataContext>
<ListBox x:Name="myListBox"  ItemsSource="{Binding List}" /> <!-- Binds to the Element list with id="1" , id="2" ... -->
</Page> 

通过这种方式,您不必在运行时更改绑定,设置DataContext一次并完成它。