gpt4 book ai didi

xaml - 将 ScrollViewer 从 ViewModel 绑定(bind)到 View

转载 作者:行者123 更新时间:2023-12-03 10:37:19 27 4
gpt4 key购买 nike

我在我的 ViewModel 中构建了一个 scrollViewer 及其元素,它被构建到一个属性 FrameworkElement PageElement 中。我重建 pageElement每次发生某些事件时,我都想绑定(bind) PageElement到 View 中的真正 scrollViewer 以便每当我更改 pageElement ,它在它的 View 中绘制自己。

最佳答案

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

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

  • 使用数据模板可以让您拥有丰富的数据表示,这些数据是在生成单个记录并在转发器或单个内容控件中呈现时构建的。
  • 使用数据模板选择器可以让您拥有各种不同的数据表示,使用代码隐藏逻辑将根据数据或其他标准在它们之间切换。

  • Ref on templates: http://blog.jerrynixon.com/2012/08/windows-8-beauty-tip-using.html



    其次,由于引发事件而重新生成 UI,这听起来像是解决性能问题的捷径。
  • 每次您手动创建元素并将它们添加到可视化树时,您的应用程序都会在重新渲染布局时面临绑定(bind)延迟的风险。在 ARM 上运行你的应用程序,我打赌你可能已经看到了。再说一次,简单的 UI 可能不会受到这个一般经验法则的影响。
  • 因为我不知道这个事件,我不能假设它经常发生。但是,如果它经常发生,那么即使是简单的 UI 也会受到影响。

  • 现在回答您的问题

    谢里夫, 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;
    }

    但让我提醒你。偏移量需要基于某些东西。这些变量可能会根据窗口大小、字体大小、变换缩放以及许多其他因素而改变。上面的代码大部分时间都可以工作,但在其他设备上可能会经常失败。

    那么该怎么办?我的建议是您在代码隐藏中对此进行编码,监控您认为需要滚动的任何场景,然后简单地以编程方式从 bode-behind 滚动它。但请注意,以编程方式滚动滚动查看器可能会使您的 UI 让用户感到困惑。

    你知道你的应用程序。你将不得不选择。

    祝你好运!

    关于xaml - 将 ScrollViewer 从 ViewModel 绑定(bind)到 View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21436362/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com