xamarin 从多个对象绑定XAML ListSource

qv7cva1a  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(154)

我有一个XAML视图,在其中绑定到ViewModel和GAME_TBL类型的ObservableCollection(Games)

<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,它是操作系统,但是然后试图在没有显式引用它的情况下使用它之外的对象?这可能是错误的。

ar7v8xwq

ar7v8xwq1#

列表视图的BindingContextGames的任何数据类型。由于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}"/>
0ejtzxu1

0ejtzxu12#

不,那只是让事情一步一步地工作--我想知道我可以先绑定颜色,然后我打算写一个方法,让每行的颜色交替
如果你想让ListView行的颜色相同,你可以在ViewModel中创建BoxViewStyle颜色属性,因为BoxViewStyle属性在ViewModel中,所以你不能为ListView日期模板绑定它,所以你首先将你的listview命名为list,找到list的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"}

        };
    }
}

相关问题