Привязка XAML ListSource из нескольких объектов - PullRequest
0 голосов
/ 23 октября 2019

У меня есть представление XAML, в котором я привязываюсь к ViewModel и ObservableCollection (Games) типа GAME_TBL

<ListView x:Name="GameListView"
          ItemsSource="{Binding Games}"
          ItemTapped="Handle_ItemTapped"
          CachingStrategy="RecycleElement"
          RowHeight="120">

Я ссылаюсь на свойства этого объекта GAME_TBL, например,

        <Label Text="{Binding GAME_NAME}"
               Style="{StaticResource GameListTitle}" />

Тем не менее, я хочу стилизовать строки списка и попытаться привязать к объекту, который не является свойством GAME_TBL

        <BoxView Grid.Column="0"
                 Grid.Row="0"
                 Grid.ColumnSpan="5"
                 Grid.RowSpan="5"
                 BackgroundColor="{Binding BoxViewStyle}"/>

Код позади той же ViewModel

    public Color BoxViewStyle

    {

        get { return _boxViewStyle; }

        set
        {

            _boxViewStyle = value;
            OnPropertyChanged(nameof(BoxViewStyle));


        }

    }

КогдаViewModel вызывается. Затем я задаю его следующим образом:

  BoxViewStyle = Color.FromHex("#000000");

Однако это не сработало

Я думаю, что это как-то связано со мной, объявляя весь ListView иметь ItemSource, который являетсяОС, но затем пытаетесь использовать объект вне этого без явной ссылки на него? Может быть, это неправильно.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

нет, это просто для того, чтобы все работало поэтапно - я хотел знать, что сначала можно связать цвет, а потом я собирался написать метод, который будет чередовать цвета в каждой строке

Если вы хотите иметь тот же цвет для строки ListView, вы можете создать цветовое свойство BoxViewStyle в ViewModel, поскольку ottermatic сказал, что свойство BoxViewStyle находится в ViewModel, поэтому вы не можете связать его для Datetemplate ListView, поэтому вы называете свой просмотр списка какво-первых, найдите список BindingContext.BoxViewStyle.

 <ListView x:Name="list" ItemsSource="{Binding games}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding GAME_NAME}" />
                            <BoxView BackgroundColor="{Binding BindingContext.BoxViewStyle, Source={x:Reference list}}" />
                        </StackLayout>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Если вы хотите чередовать цвета в каждой строке ListView, я предлагаю вам создать BoxViewStyle в модели в соответствии с индексом строки ListView для изменения цвета.

<ListView x:Name="list" ItemsSource="{Binding games}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding GAME_NAME}" />
                            <BoxView BackgroundColor="{Binding BoxViewStyle}" />
                        </StackLayout>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Model.cs:

 public class Game
{
    public int Index { get; set; }
    public string GAME_NAME { get; set; }
    public Color BoxViewStyle
    {
        get
        {
            if (Index % 2 == 0)
            {
                return Color.Red;
            }
            else
            {
                return Color.Blue;
            }
        }
    }
}

ViewModel.cs:

public class GameViewModel
{
    public ObservableCollection<Game> games { get; set; }

    public GameViewModel()
    {
        games = new ObservableCollection<Game>()
        {
            new Game(){Index=0,GAME_NAME="game 1"},
            new Game(){Index=1,GAME_NAME="game 2"},
            new Game(){Index=2,GAME_NAME="game 3"},
            new Game(){Index=3,GAME_NAME="game 4"},
            new Game(){Index=4,GAME_NAME="game 5"}

        };
    }
}

Если мой ответ решил вашу проблему, не забудьте пометить мой ответ как ответ, спасибо.

0 голосов
/ 23 октября 2019

BindingContext для вашего списка - это любой тип данных Games. Так как свойство BoxViewStyle находится в вашей ViewModel, вы не можете привязать его изнутри вашего ListView.ItemTemplate. Вам необходимо указать источник для вашего Binding.

Назовите ваш основной элемент ContentPage. x:Name="mainElement"

При установке привязки BoxViewStyle укажите источник:

<BoxView Grid.Column="0"
         Grid.Row="0"
         Grid.ColumnSpan="5"
         Grid.RowSpan="5"
         BackgroundColor="{Binding BoxViewStyle, Source={x:Reference mainElement}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...