如何从视图模型访问不可绑定的视图属性?

时间:2015-03-20 02:55:38

标签: c# wpf mvvm data-binding telerik

我使用Telerik WPF RadGanttView控件来显示一堆数据。由于数据可能是任意奇怪的 - 瞬间或最后几天或之间有一周的事件 - 因此无法设置PixelLength(即比例因子)'保证有用。我被要求用滑块改变这个比例因子。不幸的是,只是通过滑块更改比例因子具有可用性问题,我需要通过手动调整视图滚动的位置来解决这个问题。我不知道究竟是怎么回事。

概述我可修复的可用性问题:视图的工作原理是在整个"范围内提供位于"偏移"的"视口" #34;的数据集。 (来自Telerik API的术语。这些似乎只是表示可滚动视图底层画布中的像素。)当比例因子从100%变为200%时(相当于将{{1}减半) }),会发生的是范围的宽度加倍,但水平PixelLength保持不变。结果是,在放大之后,你很可能会看到完全不同于之前的数据,因为之前的事件已被拉出"右边的视口。

我打算解决这个问题的方法是:在放大,缩放之前抓住偏移/视口/范围等,然后进行一些数学运算我还没想到它和新的偏移量/视口/范围。问题是:描述滚动内容的offset属性 RadGanttView s,我不能简单地将它们绑定到DependencyProperty上的属性。 (事实上​​,他们甚至无法在XAML中访问,ViewModel明确地实现RadGanttView。)

所以,我的问题是:我如何,在IScrollingInfo或其他任何对ViewModel比例因子变化的反应中,对应的控件的访问属性ViewModel,不能数据绑定?我尝试过的每一次搜索都告诉我,从viewmodel访问视图是&#34;而不是MVVM&#34;,但是由于Telerik是第三方库,我无法真正重构它的工作方式。< / p>

我的代码的填空大纲:

FooViewModel.cs

View

FooView.xaml

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(...);
        }
    }
}

我已经研究过的事情:

  • <UserControl ... d:DataContext="{d:DesignInstance my:FooViewModel}"> <telerik:RadGanttView x:Name="Gantt"> <!-- ... --> </telerik:RadGanttView> </UserControl> 代码隐藏中创建一堆DependencyProperty包装器,只访问FooView中的相应属性。这似乎是对系统的一种可怕的滥用 - 也就是说,拥有一个不受RadGanttView支持的依赖属性似乎没有意义。而且它显然不会起作用 - 在WPF中,这种观点似乎在推动&#34;数据进入视图模型,我仍然无法实际获取当前值,因为包装器属性的值永远不会更新。
  • 呃,DependencyObject,也许吧?我在WPF上相当新,我完全不知道这些是如何工作的,只是模糊的印象,它们可能是视图模型与视图交谈的松散耦合方式。
  • 附属物?自定义绑定?超过我的工资等级,如果他们帮助我不知道我自己。看起来他们可以完成“肮脏的”#34;将控件绑定到视图模型属性的解决方案。由于该属性的类型为Command,而不是整个视图,我可以忍受。

1 个答案:

答案 0 :(得分:1)

附加行为可以解决您的问题。它们基本上是带有回调的附加属性。

查看我的回答here。只需代替KeyDown事件,您就可以注册Changed事件(或您的控件实际调用的任何事件),然后将您从Changed事件中获得的值分配给您的附属财产,并且您有两个方式绑定在不可绑定的属性

相关问题