【问题标题】:Bind ObservableCollection of CustomClass to Grid将 CustomClass 的 ObservableCollection 绑定到 Grid
【发布时间】:2014-03-13 18:30:51
【问题描述】:

我必须在单击按钮时在网格中显示 Observable Collection 的内容。在按钮单击(我知道可以使用命令绑定但为简单起见单击处理程序)集合应该填充并显示模型类的名称属性。

视图模型:

public class Sample
    {
        public ObservableCollection<SchoolModel> ModelCollection { get; set; }

        public void GridMethod()
        {
            ModelCollection = new ObservableCollection<SchoolModel>();
            ModelCollection.Add(new SchoolModel() {Id=1, Name="ABC" });
            ModelCollection.Add(new SchoolModel() { Id = 2, Name = "PQR" });
            ModelCollection.Add(new SchoolModel() { Id = 3, Name = "DEF" });
        }
    }

型号:

public class SchoolModel : INotifyPropertyChanged
    {
        private int id;
        private string name;

        public int Id
        { 
            get 
            {
                return id;
            }
            set 
            {
                id = value;
                OnPropertyChanged("Id");
            }
        }

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

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }   
    }

查看:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Button Content="Click" Click="Button_Click" Grid.Row="0" Grid.Column="0"/>

        <ItemsControl ItemsSource="{Binding ModelCollection}"  Grid.Row="0" Grid.Column="1" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Rows="{Binding Path=ModelCollection.Count}" Columns="{Binding Path=ModelCollection.Count}" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate >
                    <TextBlock Width="auto" Height="auto" Text="{Binding Path=Name}"/>                    
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>

有什么想法吗?为什么集合不显示在网格中

【问题讨论】:

  • 您设置了&lt;UniformGrid Columns="{Binding Path=ModelCollection.Count}" ../&gt;,这将导致所有项目显示在单行中。你不想要Count 的平方根或类似的东西吗?
  • 我想以格式(3*3)等在网格中显示结果

标签: c# wpf observablecollection uniformgrid


【解决方案1】:

在 Sample 类的构造函数中初始化集合,否则绑定将在加载时失败,并且在您为 ModelCollection 手动引发 PropertyChanged 事件之前它不会起作用。

要么:

public Sample()
{
   ModelCollection = new ObservableCollection<SchoolModel>();
}

在 Sample 类上也实现 INPC,并在 GridMethod() 中的初始化逻辑之后引发 PropertyChanged 事件。

    public void GridMethod()
    {
        ModelCollection = new ObservableCollection<SchoolModel>();
        ModelCollection.Add(new SchoolModel() {Id=1, Name="ABC" });
        ModelCollection.Add(new SchoolModel() { Id = 2, Name = "PQR" });
        ModelCollection.Add(new SchoolModel() { Id = 3, Name = "DEF" });
        OnPropertyChanged("ModelCollection");
    }

【讨论】:

  • 无法获取 OnPropertyChanged("ModelCollection")。编译错误 OnPropertyChanged 在当前上下文中不存在
  • 显然您需要像在 SchoolModel 类中那样在类中添加方法。从INPC 派生并创建方法。
猜你喜欢
  • 2011-04-10
  • 2014-11-01
  • 2013-09-07
  • 2019-02-24
  • 2011-05-20
  • 2013-03-03
  • 2012-05-26
  • 2018-05-21
相关资源
最近更新 更多