Xamarin.Froms Frame BackgroudЦвет изменения не отображается - PullRequest
2 голосов
/ 18 февраля 2020

У меня есть такой сценарий: ListView и каждая ячейка - это кадр. При отображении списка все кадры backgroudcolor белого цвета, когда я нажимаю на рамку, я хочу, чтобы цвет изменился в bl ie. Я меняю цвет, но не освежаю. Это мой код: На странице xaml


   <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:

        private void IzberiFirmaListView_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            var vm = BindingContext as OdberiFirmaPopupViewModel;
            var firm = e.Item as SysDashFirma;
            vm.ChangeColorOnItemSelected(firm);


        }

В viewModel

    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);
        }

Изменения вносятся в список, флаг изменен, вероятно, не могу переопределить sh контекст назначения для конвертера, прочитавшего все с начала.

1 Ответ

0 голосов
/ 18 февраля 2020

Используйте OnPropertyChanged для свойства IsActive, чтобы уведомить пользовательский интерфейс о его изменении.

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, так как удаление и добавление элемента не требуется.

<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

public class ViewModel : INotifyPropertyChanged
{

....
....

    private Firm oldSelectedFirm;

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

...
...

}

Xaml.cs

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;
}

...