【问题标题】:Set two way binding numbers position xamarin设置双向绑定号码位置 xamarin
【发布时间】:2020-07-24 03:42:25
【问题描述】:

我像这样创建引脚组合布局

Image

代码:

<StackLayout>
                <Grid>
                    <Grid Margin="0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Button x:Name="btn7" Text="7" HeightRequest="160" WidthRequest="180" Margin="10" BackgroundColor="White" FontSize="50"  />
                    <Button x:Name="btn8" Text="8" HeightRequest="160" WidthRequest="180" Margin="10" Grid.Column="1" BackgroundColor="White" FontSize="50" />
                        <Button x:Name="btn9" Text="9"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Column="2" BackgroundColor="White" FontSize="50"/>
                        <Button Text="6"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Column="2" Grid.Row="1" BackgroundColor="White" FontSize="50"/>
                        <Button Text="5"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Column="1" Grid.Row="1" BackgroundColor="White" FontSize="50" />
                        <Button Text="4"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="1" BackgroundColor="White" FontSize="50" />
                        <Button Text="1"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="2" BackgroundColor="White" FontSize="50" />
                        <Button Text="2"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="2" Grid.Column="1" BackgroundColor="White" FontSize="50" />
                        <Button Text="3"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="2" Grid.Column="2" BackgroundColor="White" FontSize="50" />
                        <Button Text="0"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="3" Grid.Column="1" BackgroundColor="White" FontSize="50" />
                        <Button Text="Ok" HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="3" BackgroundColor="White" FontSize="50"/>
                        <Button Text="Clear"  HeightRequest="160" WidthRequest="180" Margin="10" Grid.Row="3" Grid.Column="2" BackgroundColor="White" FontSize="50" />
                    </Grid>
                </Grid>
            </StackLayout>

我想做所有数字按钮的随机位置,所以我想要0,1,2,3,4,5,6,7,8,9,但每次访问此视图时都处于不同的位置。我从两个绑定类开始,我的结构如下:

public class PinPageViewModel : BaseViewModel
    {

        public PinPageViewModel()
        {
            _ = LoadItems();
        }

        public PinPageViewModel(INavigation navigation)
        {
            _ = LoadItems();
            Navigation = navigation;
        }


        public INavigation Navigation { get; set; }
       

        private async Task LoadItems()
        {
            try
            {
              
            }
            catch (Exception ex)
            {
                return;
            }
          

        }

    }

那么我需要做些什么来实现这一目标?我的意思是我需要在stacklayout的每个按钮中做什么,那么我如何在绑定视图模型中接收然后设置随机文本,最后是一个知道按下哪个按钮的函数?

更新

作为下面的评论,我有一些问题,每个按钮都应该有Text="{Binding Number}"(所有按钮都应该有相同的)?

那我把ViewModel改成:

  public PinPageViewModel()
        {
            _ = LoadItems();
        }

        public PinPageViewModel(INavigation navigation)
        {
            _ = LoadItems();
            Navigation = navigation;
        }


        public INavigation Navigation { get; set; }

        private int _number;

        public int Number
        {
            get { return _number; }
            set { SetProperty(ref _number, value, nameof(Number)); }
        }
       

        private async Task LoadItems()
        {
            try
            {

                SetNumber();

            }
            catch (Exception ex)
            {
                return;
            }
        }


        private void SetNumber()
        {
            int Min = 0;
            int Max = 9;
            Random randNum = new Random();
            int[] test2 = Enumerable
                .Repeat(0, 5)
                .Select(i => randNum.Next(Min, Max))
                .ToArray();

          //How can I assign a number to each button?
        }
    }

如何在随机数之后为每个按钮分配按钮值?问候

【问题讨论】:

  • 创建一个数组 0..9。随机化它的顺序。然后将每个元素绑定到您的 UI
  • 我更新了我的问题,完成所有更改后如何绑定? @杰森

标签: xamarin two-way-binding


【解决方案1】:

创建您的号码列表

public List<string> data { get; set; } = new List<string>{"0", "1", ... "9" };

randomize the order

在您的 XAML 中,将每个按钮绑定到列表中的一个元素

<Button Text="{Binding data[0]}" Clicked="ButtonClick" ... />
...
<Button Text="{Binding data[9]}" Clicked="ButtonClick" ... />

然后在您的点击处理程序中

protected void ButtonClick(object sender, EventArgs args)
{
  var button = (Button)sender;
  var number = button.Text;
}

【讨论】:

  • 是否可以取消按钮的 Clicked 事件?我的意思是使用命令检测点击并设置为查看模型?
  • 当然,只需将Command 属性绑定到您的虚拟机
  • 在视图模式中处理它是否比 xaml 类更好?你有什么推荐?
  • 如果你是硬核 MVVM,你应该使用 Command。但除此之外,做任何对你有用的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2016-06-05
  • 2010-11-10
  • 1970-01-01
  • 2016-01-03
相关资源
最近更新 更多