我在ViewModel中构建了一个scrollViewer及其元素,并将其内置到属性FrameworkElement PageElement
中,每当发生某些事件时,我都会重新构建pageElement
,我想将PageElement
绑定(bind)到View中的一个真正的scrollViewer,以便每当我更改pageElement
时,它都会绘制它本身认为。
最佳答案
让我给您一些扶手椅建议。我不知道您的项目的细节,但是您问题中的细节使我得出了一些结论。
首先,让您的 View 模型创建UI元素并没有错。但这确实不寻常。听起来您可能缺少数据模板或数据模板选择器的概念。
其次,由于引发事件而重新生成用户界面听起来像是解决性能问题的捷径。
现在回答您的问题
Sherif,在
scrollviewer
上没有可设置水平或垂直偏移量的可写属性。设置scrollviewer
的偏移量的唯一方法是调用changeview()
。var s = new ScrollViewer();
s.ChangeView(0, 100, 0);
您无法绑定(bind)到方法,因此绑定(bind)到类似这样的东西是没有任何入门的,不需要任何代码即可读取所需的偏移量并直接调用该方法。
像这样:
public sealed partial class MainPage : Page
{
MyViewModel _Vm = new MyViewModel();
ScrollViewer _S = new ScrollViewer();
public MainPage()
{
this.InitializeComponent();
this._Vm.PropertyChanged += (s, e) =>
{
if (e.PropertyName.Equals("Offset"))
_S.ChangeView(0, _Vm.Offset, 0);
};
}
}
public class MyViewModel : INotifyPropertyChanged
{
private int _Offset;
public int Offset
{
get { return _Offset; }
set
{
_Offset = value;
PropertyChanged(this, new PropertyChangedEventArgs("Offset"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
但是让我告诫你。偏移量将需要基于某些内容。这些变量可能会根据窗口大小,字体大小,转换缩放比例以及许多其他因素而变化。上面的代码大多数时候都可以工作,但是在其他设备上可能经常失败。
那么该怎么办?我的建议是您在后台代码中对此进行编码,监视您认为需要滚动的任何情况,并以编程方式从后台进行滚动。但是请注意,以编程方式滚动scrollviewer可能会使您的UI迷惑于用户。
您知道您的应用程序。您将不得不选择。
祝你好运!
关于xaml - 将ScrollViewer从ViewModel绑定(bind)到View,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21436362/