【问题标题】:How to dynamically change the colour of label? Xamarin如何动态改变标签的颜色?赛马林
【发布时间】:2019-04-26 23:39:06
【问题描述】:

我在下面得到了这段代码,但我不知道如何使选定的标签变成蓝色背景颜色和白色文本,而不是它在未选择模式下的内容。一次只能选择1个行程,选择的那个需要修改。我想我可以使用数据触发器或行为。我可以弄清楚如何更改命令中的按钮,但我将如何更改其他按钮?被取消选择成灰色?

<CollectionView Grid.Row="1" Grid.Column="0" ItemsSource="{Binding JourneyItems}" SelectionMode="Single"  ItemsLayout="{x:Static ListItemsLayout.HorizontalList}">
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <StackLayout Orientation="Horizontal" >
                <StackLayout Margin="10,0,10,0" BackgroundColor="LightGray"  VerticalOptions="Fill"  Orientation="Horizontal" >
                    <Label Text="{Binding Name}"  TextColor="{StaticResource ThemeBkColor}" VerticalTextAlignment="Center" VerticalOptions="Center" />
                </StackLayout>

                <StackLayout.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding Path=ViewModel.SwitchJourneyCommand, Source={x:Reference ThisJourneysPage}}"
                        CommandParameter = "{Binding .}" NumberOfTapsRequired="1"/>
                </StackLayout.GestureRecognizers>
            </StackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

【问题讨论】:

  • 我没有使用 CollectionView 但在您的项目模型中,创建一个名为 IsSelected (或其他东西)的属性来驱动颜色绑定,然后当另一个项目被选中时,循环所有其他对象并设置IsSelected 为 false ...或使用 MessagingCenter 来执行此操作...不过,我会使用前一种方法。不确定这是否有帮助,但这是一个想法。我假设 CollectionView 会在选择事物时为您提供事件。

标签: c# xaml xamarin xamarin.forms


【解决方案1】:

您只需将Selected 属性添加到您的JourneyItems 模型,然后甚至是BackgroundColor。

public class JourneyItem {
    // more stuff

    public bool Selected { get; set; }

    public Color BackgroundColor => Selected ? Color.Blue : Color.Gray;

    public Color TextColor => Selected ? Color.White : Color.Black;
}

然后绑定BackgroundColorTextColor,当Selectedtrue时变为X颜色,否则为Y颜色。

<Label Text="{Binding Name}"  TextColor="{Binding TextColor}"  BackgroundColor="{Binding BackgroundColor}"/>

最后,在ViewModel.SwitchJourneyCommand 中将您选择的模型设置为true,将所有其他模型设置为false

public void OnJourneyCommand(JourneyItem selectedItem) {
    foreach(JourneyItem item in JourneyItems) {
        item.Selected = item.Id == selectedItem.Id;
    }
}

*编辑:需要明确的是,当Selected 更改时,这不会自动更改颜色。对象属性不会作为更改事件自动冒泡。为此,您需要将属性更改事件添加到Selected 属性,并让它在Selected 切换时触发BackgroundColorTextColor 的更改。像这样:https://stackoverflow.com/a/39350109/3850012

【讨论】:

  • 为什么使用模型来存储视觉相关状态(选定状态和颜色),为什么不使用转换器?
  • @slugster 为了让这个例子更短,因为转换器在某些情况下看起来很重。我喜欢为我的视图创建可以存储一些视觉信息的模型。这种模型与服务器和客户端来回传递的模型不同。
  • @hvaughan3 它本质上是一个 ViewModel,它是一种可接受的方法。好答案。这是我在评论中建议的,也许这就是我有偏见的原因。 :-)
  • @hvaughan3 然后这使它成为一个 view 模型。这使您的方法更容易被接受,但使用转换器仍然是更理想的方式(我同意转换器经常被误用和滥用)。
  • @slugster 毕竟,如果我们要拆分头发,视图模型就是您的视图模型。
猜你喜欢
  • 2016-01-07
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多