【问题标题】:Bind value for "Maximum' property not working on Slider Xamarin“Maximum”属性的绑定值在 Slider Xamarin 上不起作用
【发布时间】:2020-10-29 10:41:49
【问题描述】:

我试图在 Slider 最大值上使用 ViewModel 属性,但是当我使用 Binding 时,滑块总是将当前值显示为 0。

使用固定值,它可以工作:

<Slider Minimum="0" Maximum="16" Value="{Binding SliderStep, Mode=OneWay}" HorizontalOptions="CenterAndExpand" />

但是最大值是可变的,所以我需要从 ViewModel 中绑定它,当我尝试这样做时出现问题:

<Slider Minimum="0" Maximum="{Binding SliderMax}" Value="{Binding SliderStep, Mode=OneWay}"  HorizontalOptions="CenterAndExpand" />

ViewModel 代码:

double sliderStep;
    public double SliderStep
    {
        get
        {
            return sliderStep;
        }
        set { sliderStep = value;
            OnPropertyChanged("SliderStep");
        }
    }

    double sliderMax;
    public double SliderMax
    {
        get
        {
            return sliderMax;
        }
        set {
            sliderMax = value;
            OnPropertyChanged();
        }
    } 
public SectionGraphicViewModel(INavigation navigation)
        {
            this.Navigation = navigation;
            sectionRep = new SectionRepository();
            this.Sections = sectionRep.GetSections().ToList();
            Items = new List<SectionGraphicModel>();
            foreach (var item in this.Sections)
            {
                var SectionView = new SectionModel(item);
                Items.Add(new SectionGraphicModel(){ Source = SectionView.CachedImageUsed.Source, Desc = SectionView.Desc, Id = SectionView.Id });
            }
            SliderMax = items.Count();
            if (sectionId.HasValue)
            {
                SliderStep = items.FindIndex(x => x.Id == sectionId);
            }
            else
            {
                SliderStep = 0;
            }
        }

这个例子的最大值是16,我用不同的值测试,结果是一样的。 我只在安卓模拟器上测试过。我不知道它是否会发生在 iOS 上。

PS:为了避免误解,我需要让Maximum属性绑定一个来自VM的值,而OneWay,控件将从UI被禁用,只显示来自VM的值。

【问题讨论】:

  • 我刚刚做了一个演示,它工作正常。也许您可以上传一个 repo 以进一步使我们能够为您提供帮助。
  • 当然,我做了一个示例项目,结果相同,你可以在这里得到它:1drv.ms/u/s!Ai_z8JkGS7hIdOzWIvtMQVg4qKk?e=v4K9b5 在 AppTest.Views.AboutPage 你可以看到 2 个滑块,一个具有静态值(黄色)的工作和一个来自绑定(蓝色)的值不起作用并且以错误的值开头。

标签: xamarin xamarin.forms xamarin.android


【解决方案1】:

您应该按照确保Maximum始终大于Minimum的顺序设置属性,Maximum应该在xaml中的Minimum之前设置:

<Slider  BackgroundColor="Aquamarine" Maximum="{Binding SliderMax}" Minimum="0" Value="{Binding SliderStep}" IsEnabled="False"  VerticalOptions="EndAndExpand" ></Slider>

如果要禁用 UI,请设置:

IsEnabled="False"

参考:slider#precautions

【讨论】:

  • 它起作用了,答案是将最大值放在最小值之前,只需改变位置即可。 TKS 很多!
  • 我已经这样设置了: 仍然出现同样的错误。
【解决方案2】:

我没有正确阅读问题。问题只是绑定模式

Value="{Binding SliderStep, Mode=TwoWay}

应该这样做。

PS:每当您上传示例存储库时,请从所有共享和目标项目中删除所有 bin/obj 文件。您的项目小于 2 MB,但我因 bin/obj 下载的 zip 为 50+ MB。

【讨论】:

  • 不工作,当我在蓝色滑块上设置 TwoWay 时,它会将值更改为零,黄色也以零开头。
  • 澄清一下,我不想更改屏幕中的值,这就是 OneWay 的原因。我只希望它从 ViewModel 的正确值开始,就像黄色使用固定值一样。
  • 您希望滑块不要从 UI 中移动?只是通过虚拟机
  • 是的,滑块将被禁用,仅显示位置。这我已经在其他页面上工作了。这里的问题是从VM设置最大值。
  • 然后设置IsEnabled="False"
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多