将对象列表绑定到网格

Eli*_* MP 1 c# xamarin xamarin.forms

尝试将带有网格的 ListView 渲染到其中。网格包含两列。第一个,带按钮。第二个,带标签。

模型包含两个属性。第一个,特定对象的列表。第二个,一个字符串。

最后,listview 中网格的标签将绑定到 Model 对象列表的一个随机属性上。

我最好的方法是:

<ListView x:Name="intervectionList"
                  ItemsSource="{Binding .}">
      <ListView.ItemTemplate>
        <DataTemplate>
          <ViewCell>
            <Grid Padding="5">
              <Grid.RowDefinitions>
                <RowDefinition Height="20"></RowDefinition>
                <RowDefinition Height="1"></RowDefinition>
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"></ColumnDefinition>
                <ColumnDefinition Width="3*"></ColumnDefinition>
              </Grid.ColumnDefinitions>

              <Button Text="Play" Grid.Row="0" Grid.Column="0" Clicked="OnLogginClicked"/>
              <Label Grid.Row="0" Grid.Column="1" Text="{Binding random_attribute}"/>
              <BoxView Color="Navy" HeightRequest="1" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"/>

            </Grid>
          </ViewCell>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>
Run Code Online (Sandbox Code Playgroud)

代码隐藏:

public Intervection()
        {
            InitializeComponent();
            var obj= new Model();
            this.BindingContext = prueba.List_of_object;
        }

public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void RaiseOnPropertyChange([CallerMemberName] string propertyName = null)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    public ViewModel()
    {
        _viewmodel = new ViewModel();
    }

    private ViewModel _viewmodel;

    private string _attribute1;

    public string Attribute1
    {
        get { return _attribute1; }
        set { _attribute1= value; RaiseOnPropertyChange(); }
    }
.............
    }

public class Model
    {
        public List<obj> Intervencion;
        public string attribute2;
// Helpers...
}
Run Code Online (Sandbox Code Playgroud)

那不是渲染任何东西。

我尝试了连续的方法。来自带有字符串的 Basic ListView、对象的 ListView 等等。问题出在我插入网格时。

检查 Stackoverflow 后。我找到了这个链接Create Grid from Code-Behind,但这不符合我的目的,因为我无法重写视图模型。(我什至试图对其进行编码)。

像往常一样,谢谢伙伴们。

Roh*_*ews 5

我已经加入了VerticalOptionsListviewGrid。我创建了一个视图模型,其中有一个属性,即项目列表。视图模型还实现了INotifyPropertyChanged.

您可以在此处阅读有关 INotifyPropertyChanged 的信息

INotifyPropertyChanged 接口用于通知客户端(通常是绑定客户端)属性值已更改。

XAML:

<ListView ItemsSource="{Binding MyObservableCollection}" VerticalOptions="FillAndExpand">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <Grid Padding="5" VerticalOptions="Fill">
            <Grid.RowDefinitions>
              <RowDefinition Height="20"></RowDefinition>
              <RowDefinition Height="1"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="1*"></ColumnDefinition>
              <ColumnDefinition Width="3*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <Button Text="Play" Grid.Row="0" Grid.Column="0"/>
            <Label Grid.Row="0" Grid.Column="1" Text="{Binding .}"/>
            <BoxView Color="Navy" HeightRequest="1" Grid.Row="1" 
                     Grid.Column="0" Grid.ColumnSpan="2"/>

          </Grid>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
Run Code Online (Sandbox Code Playgroud)

视图模型:

public class ListViewWithGridViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> _myObservableCollection;

    public ListViewWithGridViewModel()
    {
        MyObservableCollection = new ObservableCollection<string>(new List<string> { "abc", "xyz", "pqr", "aaa", "abc", "xyz", "pqr", "aaa", "abc", "xyz", "pqr", "aaa" });
    }

    public ObservableCollection<string> MyObservableCollection
    {
        get { return _myObservableCollection; }
        set
        {
            _myObservableCollection = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)

XAML.cs :

public partial class ListViewWithGrid : ContentPage
{
    public ListViewWithGrid()
    {
        InitializeComponent();
        BindingContext = new ListViewWithGridViewModel();
    }
}
Run Code Online (Sandbox Code Playgroud)