为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据 Xamarin 和 XAML 中的绑定属性更改按钮的属性

如何根据 Xamarin 和 XAML 中的绑定属性更改按钮的属性

C#
HUWWW 2023-07-09 15:18:33
我正在尝试使用 XAML 和 Xamarin 制作一个列表视图,其中包含带有用户信息的标签。有人应该能够从列表中选择多个用户。如果他们愿意,可以使用顶部的“全选”按钮。未选中的人应该有一个灰色按钮,上面写着“表现出兴趣”。选定的人应该有一个带有文本“删除兴趣”的绿色按钮。我通过使用我需要的信息以及以下信息创建一个类来完成此操作:public bool IsSelected { get; set; }public Color ButtonColor { get { return IsSelected ? Color.LightGreen : Color.LightGray; } }public string Status { get { return IsSelected ? "Remove\nInterest" : "Show\nInterest"; } }在 xaml 中,我将按钮的属性绑定到颜色和状态:<ListView x:Name="ItemsListView"                ItemsSource="{Binding Results}"                VerticalOptions="FillAndExpand"                HasUnevenRows="True"                IsPullToRefreshEnabled="False">        <ListView.ItemTemplate>            <DataTemplate>                <ViewCell>                    <Grid>                        <Button                            Text="{Binding Status}"                            BackgroundColor="{Binding ButtonColor}"                            Clicked="ChangeInterest"                            Grid.Row="0"                            Grid.RowSpan="6"                            Grid.Column="10"                            Grid.ColumnSpan="5"                            />                    </Grid>                </ViewCell>            </DataTemplate>        </ListView.ItemTemplate>    </ListView>ChangedInterest 只是找到适当的项目并切换“IsSelected”。既然属性绑定到变量,并且变量绑定到 IsSelected,按钮不应该自动更改吗?如果在 ChangedInterest 函数中写入 (sender as Button).Text = Results[i].Status; 适当的颜色行,它就会发生变化。“全选”按钮只是滚动浏览列表中的所有项目,并将每个项目的 IsSelected 设置为 true。期望的结果是所有按钮都根据第一个块的规则更改颜色和文本。有没有办法让属性随着绑定的改变而自动改变?
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

虽然您使用了数据绑定,但您可以使用Command而不是按钮的ClickEvent。


在XAML中


<Button

    Text="{Binding Status}"

    BackgroundColor="{Binding ButtonColor}"

    Command="{Binding Selected}"

    Grid.Row="0"

    Grid.RowSpan="6"

    Grid.Column="10"

    Grid.ColumnSpan="5"/>

在你的模型中


public class Model : INotifyPropertyChanged

{

    public event PropertyChangedEventHandler PropertyChanged;


    bool isSelected;

    public bool IsSelected {

        get { return isSelected; }


        set {                 

                isSelected = value;

                NotifyPropertyChanged();


                if(value)

                {

                    ButtonColor = Color.LightGreen;

                    Status = "Remove\nInterest";

                }

                else

                {

                    ButtonColor = Color.LightGray;

                    Status = "Show\nInterest";

                }               

        }

    }


    Color buttonColor;

    public Color ButtonColor {

        get { return buttonColor; }


        set {               

                buttonColor = value;

                NotifyPropertyChanged();                 

        }

    }


    string status;

    public string Status {

        get { return status; }


        set {                

                status = value;

                NotifyPropertyChanged();            

        }

    }



    public ICommand Selected { get; private set; }


    public Model()

    {

        Selected = new Command(() => { IsSelected = !IsSelected; });

    }


    protected virtual void NotifyPropertyChanged([CallerMemberName] string propertyName = "")

    {

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }


}



查看完整回答
反对 回复 2023-07-09
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信