我在ViewModel中构建了一个scrollViewer及其元素,并将其内置到属性FrameworkElement PageElement中,每当发生某些事件时,我都会重新构建pageElement,我想将PageElement绑定(bind)到View中的一个真正的scrollViewer,以便每当我更改pageElement时,它都会绘制它本身认为。

最佳答案

让我给您一些扶手椅建议。我不知道您的项目的细节,但是您问题中的细节使我得出了一些结论。

首先,让您的 View 模型创建UI元素并没有错。但这确实不寻常。听起来您可能缺少数据模板或数据模板选择器的概念。

  • 使用数据模板可以使您在重复记录器或单个内容控件中生成并呈现单个记录时生成丰富的数据表示。
  • 使用数据模板选择器,您可以拥有各种不同的数据表示形式,使用代码隐藏逻辑将根据数据或其他条件在这些表示形式之间进行切换。



  • 其次,由于引发事件而重新生成用户界面听起来像是解决性能问题的捷径。
  • 每次您手动创建元素并将其添加到可视树时,都会在重新渲染布局时使您的应用面临绑定(bind)滞后的风险。在ARM上运行您的应用程序,我敢打赌您可能已经看到了它。再一次,简单的UI可能不会受到一般经验法则的困扰。
  • 因为我不知道该事件,所以我不能认为它经常发生。但是,如果它经常发生,那么即使是一个简单的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/

    10-13 05:57