首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin.Froms帧BackgroudColor更改未显示

Xamarin.Froms帧BackgroudColor更改未显示
EN

Stack Overflow用户
提问于 2020-02-18 10:14:17
回答 1查看 151关注 0票数 2

我有这样的场景:一个ListView和每个单元格都是一个框架。当显示列表时,所有帧的背景颜色都是白色的,当我单击框架时,我希望在blie中更改颜色。我改变颜色,但不提神。这是我的代码:在xaml页面中

代码语言:javascript
运行
复制
   <pages:PopupPage.Resources>
        <local1:ChangeFrameBackgroudColor x:Key="ChangeFrameBackgroudColor" />
    </ResourceDictionary>-->
    </pages:PopupPage.Resources>
  <ListView x:Name="IzberiFirmaListView" HasUnevenRows="True"  ItemsSource="{Binding KorisnikFirmi}" SelectedItem="{Binding IzbranaFirmaId } " Header="{Binding}" ItemTapped="IzberiFirmaListView_ItemTapped">
                <ListView.ItemTemplate >
                    <DataTemplate>
                        <local:ExtendedViewCell SelectedBackgroundColor="#2188ff"  >

                            <StackLayout  Padding="20, 10"  >
                                <Frame x:Name="frameLabel" BorderColor="#2188ff" BackgroundColor="{Binding IsActive, Converter={StaticResource ChangeFrameBackgroudColor}}">
                                    <Label  FontAttributes="Bold" FontSize="18" TextColor="Black" Text="{Binding Naziv}" ></Label>
                                </Frame>
                            </StackLayout>

                        </local:ExtendedViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
                <ListView.HeaderTemplate>
                    <DataTemplate>
                        <ContentView BackgroundColor="#006BE6" >
                            <Label Margin="10" HorizontalOptions="CenterAndExpand" Text="ОДБЕРЕТЕ ФИРМА"  TextColor="White" FontSize="20" FontAttributes="Bold"/>
                        </ContentView>
                    </DataTemplate>
                </ListView.HeaderTemplate>
            </ListView>

在xaml.cs页面中:

代码语言:javascript
运行
复制
        private void IzberiFirmaListView_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            var vm = BindingContext as OdberiFirmaPopupViewModel;
            var firm = e.Item as SysDashFirma;
            vm.ChangeColorOnItemSelected(firm);


        }

在viewModel中

代码语言:javascript
运行
复制
    public List<SysDashFirma> KorisnikFirmi
        {
            get { return korisnikFirmi; }
            set
            {
                if (korisnikFirmi != value)
                {
                    korisnikFirmi = value;

                    SetProperty(ref korisnikFirmi, value);
                    OnPropertyChanged("KorisnikFirmi");

                }
            }
        }
  public void ChangeColorOnItemSelected(SysDashFirma firm)
        {
            if (_oldFirmSelected == firm)
            {
                //firm.BackColor = "#2188ff";
                firm.IsActive = true;
                UpdateSelectedFirmItemColor(firm);
            }
            else
            {
                if(_oldFirmSelected != null)
                {
                    //_oldFirmSelected.BackColor = "#f5f5f5";
                    _oldFirmSelected.IsActive = false;
                    UpdateSelectedFirmItemColor(_oldFirmSelected);
                }
                // firm.BackColor = "#2188ff";
                firm.IsActive = true;
                UpdateSelectedFirmItemColor(firm);
            }


            _oldFirmSelected = firm;
        }

        private void UpdateSelectedFirmItemColor(SysDashFirma firm)
        {
            var index = KorisnikFirmi.IndexOf(firm);
            KorisnikFirmi.Remove(firm);
            KorisnikFirmi.Insert(index,firm);
        }

在列表中进行更改,更改标志,可能无法刷新从一开始就读取的转换上下文。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-18 11:45:57

使用OnPropertyChanged对IsActive属性通知UI其更改。

代码语言:javascript
运行
复制
public class Firm : INotifyPropertyChanged
{
    private string name = "Unknown";

    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged();
        }
    }

    private bool isActive;

    public bool IsActive
    {
        get
        {
            return isActive;
        }
        set
        {
            isActive = value;
            OnPropertyChanged();
        }
    }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

我建议仅更改IsActive属性,因为没有必要删除和添加该项。

代码语言:javascript
运行
复制
<ListView
    ItemTapped="ListView_ItemTapped"
    ItemsSource="{Binding FirmCollection}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Frame
                    Padding="2"
                    BackgroundColor="{Binding IsActive, Converter={StaticResource converterTest}}">
                    <Label Text="{Binding Name}"/>
                </Frame>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

ViewModel

代码语言:javascript
运行
复制
public class ViewModel : INotifyPropertyChanged
{

....
....

    private Firm oldSelectedFirm;

    public Firm OldSelectedFirm
    {
        get
        {
            return oldSelectedFirm;
        }
        set
        {
            oldSelectedFirm = value;
            OnPropertyChanged();
        }
    }

...
...

}

Xaml.cs

代码语言:javascript
运行
复制
void ListView_ItemTapped(System.Object sender, Xamarin.Forms.ItemTappedEventArgs e)
{
    var tappedFirm = (e.Item as Firm);
    var vm = (BindingContext as ViewModel);
    if (vm.OldSelectedFirm != null)
        vm.OldSelectedFirm.IsActive = false;

    tappedFirm.IsActive = true;
    vm.OldSelectedFirm = tappedFirm;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60278467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档