滑块和入口之间的两种绑定方式

时间:2017-08-22 21:33:42

标签: xaml binding xamarin.forms

我想用Slider绑定一个Entry,反之亦然。我写了这样的话:

<Entry x:Name="myEntry" Text="{Binding Value, Mode=TwoWay}"  BindingContext="{x:Reference slider}"/>
<Slider x:Name="slider" Maximum="100" Minimum="0"  BindingContext="{x:Reference myEntry}"/>

当我使用滑块时,条目中的值会更新,但是当我在Entry中手动设置一些值时,该值会附加0或更改为0.可能是什么问题。我正在开发android。

3 个答案:

答案 0 :(得分:0)

您应该在支持视图模型中将Slider和Entry绑定到字符串/整数。

class MyViewModel 
{
    private int _sliderValue;
    public string EntryText 
    {
        get => _sliderValue.ToString();
        set => SetProperty(ref _sliderValue, int.Parse(value) );
    }

    public int SliderValue
    {
        get => _sliderValue;
        set => (ref _sliderValue, value);
    }
}

在视图中

<Entry Text="{Binding EntryText}" />
<Slider Value="{Binding SliderValue}" />

More MVVM Info

Fresh MVVM for Xamarin

Caliburn Micro for Xamarin

答案 1 :(得分:0)

请参考以下xaml代码

<Frame HorizontalOptions="FillAndExpand" VerticalOptions="StartAndExpand">
        <StackLayout>
        <Entry Text="{Binding Path=Value}"
           FontSize="18"
           x:Name="label"
           BindingContext="{x:Reference Name=slider}"/>
    <Slider x:Name="slider"
            Maximum="1500"
            VerticalOptions="CenterAndExpand" />

        </StackLayout>
    </Frame>

答案 2 :(得分:0)

使用视图模型也可以实现同样的效果,请参考代码

Xaml

<Frame HorizontalOptions="FillAndExpand" VerticalOptions="StartAndExpand">
        <StackLayout>
            <Entry x:Name="NameEntry" Placeholder="Enter Name"  Text="{Binding Forename,Mode=TwoWay}" />

            <Slider Value="{Binding Forename}" Minimum="0"  Maximum="10"/>

        </StackLayout>

    </Frame>

-------------------现在在ac#文件中看到模型-------------------- ---------------

public partial class MainPage : ContentPage
{

    public class DetailsViewModel : INotifyPropertyChanged
    {
        int forename;
        public int Forename
        {
            get
            {
                return forename;
            }
            set
            {
                if (forename != value)
                {
                    forename = value;
                    OnPropertyChanged ("Forename");
                }
            }


        }
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var changed = PropertyChanged;
            if (changed != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

    public MainPage()
    {
        InitializeComponent();      
       BindingContext = new DetailsViewModel();

    }
}