【发布时间】:2015-03-20 02:55:37
【问题描述】:
我正在使用 Telerik WPF RadGanttView 控件来显示一堆数据。由于数据可能是任意奇怪的 - 瞬时事件,或者最后几天的事件,或者它们之间有一周 - 不可能设置一个保证有用的PixelLength(即比例因子)。我被要求用滑块改变这个比例因子。不幸的是,仅使用滑块更改比例因子存在可用性问题,我需要通过手动调整视图的滚动位置来解决此问题。我不知道到底是怎么回事。
概述我正在修复的可用性问题:视图通过在数据集的整个“范围”上提供位于“偏移”处的“视口”来工作。 (从Telerik API 中提取的术语。这些似乎只是表示可滚动视图下的画布中的像素。)当比例因子从 100% 变为 200% 时(相当于将PixelLength 减半),什么发生的是 extent 的宽度加倍,但水平的offset 保持不变。结果是,在放大之后,您很可能会看到与以前完全不同的数据,因为之前存在的事件已从右侧的视口中“拉出”。
我打算解决这个问题的方法是:在放大之前获取偏移量/视口/范围等,然后用新的偏移量/视口/范围做一些我还没有弄清楚的数学运算。问题是:描述滚动内容的RadGanttView 的属性是not DependencyPropertys,我不能简单地将它们绑定到我的ViewModel 上的属性。 (事实上,它们甚至无法在 XAML 中访问,RadGanttView 明确地实现了 IScrollingInfo。)
所以,我的问题是:我如何在我的ViewModel 或其他任何地方响应ViewModel 的比例因子变化,访问相应View 中的控件属性,这是不可能的数据绑定?我尝试的每一次搜索都告诉我从视图模型访问视图“不是 MVVM”,但由于 Telerik 是第三方库,我无法真正重构它在他们方面的工作方式。
我的代码的填空大纲:
FooViewModel.cs
class FooViewModel
{
// A slider in the view pushes its value into this property
double ScaleFactor
{
get { /*...*/ }
set
{
PixelLength = GetNewPixelLength(value);
// ...
}
}
// The RadGanttView pulls its scale from this property
double PixelLength
{
get { ... }
set
{
// How do I get these values?
var oldOffset = ???;
var oldExtent - ???;
// Trigger the actual change in the view.
PropertyChanged("PixelLength", ...);
var newExtent = ???;
???.HorizontalOffset = GetNewOffset(...);
}
}
}
FooView.xaml
<UserControl ... d:DataContext="{d:DesignInstance my:FooViewModel}">
<telerik:RadGanttView x:Name="Gantt">
<!-- ... -->
</telerik:RadGanttView>
</UserControl>
我研究过的东西:
- 在
FooView代码隐藏中创建一堆DependencyProperty包装器,只访问RadGanttView中的相应属性。这似乎都是对系统的可怕滥用 - 即,拥有不受DependencyObject支持的依赖属性似乎没有意义。而且它根本不起作用 - 在 WPF 中,视图似乎将数据“推送”到视图模型中,我仍然无法实际获取当前值,因为包装器属性的值永远不会得到更新。 - 呃,
Commands,也许吧?我是 WPF 的新手,我根本不知道它们是如何工作的,只是一个模糊的印象,它们可能是视图模型与视图对话的松散耦合方式。 - 附加属性?自定义绑定?远远高于我的工资等级,如果他们帮助我自己不知道如何。似乎他们可以完成将控件绑定到视图模型属性的“肮脏”解决方案。由于该属性的类型是
IScrollingInfo,而不是整个视图,我可以接受。
【问题讨论】:
标签: c# wpf mvvm data-binding telerik