0

I need to inherit my Collection as Class as follows:

public class UsageCollection
        : ObservableCollection<UsageStatistics>
{
    public UsageCollection()
    {
       // static initialization
        Add(new UsageStatistics("A", 6, "1/2/2012"));
        Add(new UsageStatistics("C", 8, "1/2/2012"));
    }  
}

public class UsageStatistics
{
    public string Alias { get; set; }
    public int ActivityCount { get; set; }
    public string Date { get; set; }

    public UsageStatistics(
        string alias,
        int activityCount,
        string date
        )
    {
        Alias = alias;
        ActivityCount = activityCount;
        Date = date;
    }
}

As you can see I can statically initialize it in the constructor.

However , I am fetching this collection at runtime in reality. How can I assign that collection to this class?

The collection im fetching is ObservableCollection<UsageStatisctics>.

The reason I need to encapsulate is because infragistics needs this:

 <Window.Resources>
        <comboSourceCase:UsageCollection x:Key="data" />
        <ig:GroupBy   
            x:Key="grouped"  
            ItemsSource="{StaticResource data}"   
            GroupMemberPath="Date"   
            KeyMemberPath="Alias"   
            ValueMemberPath="ActivityCount" />
    </Window.Resources>

    <Grid Margin="0,0,2,-2">
        <ig:XamDataChart x:Name="theChart" Height="200">
            <ig:XamDataChart.Axes>
                <ig:CategoryXAxis x:Name="xAxis"   
                                       ItemsSource="{StaticResource grouped}"  
                                       Label="{}{Key}"/>
                <ig:NumericYAxis x:Name="yAxis" />
            </ig:XamDataChart.Axes>

            <ig:XamDataChart.Series>
                <ig:StackedColumnSeries x:Name="stack"  
                                             ItemsSource="{StaticResource grouped}"  
                                             XAxis="{Binding ElementName=xAxis}"  
                                             YAxis="{Binding ElementName=yAxis}"  
                                             AutoGenerateSeries="True"  
                                             >

                </ig:StackedColumnSeries>
            </ig:XamDataChart.Series>
        </ig:XamDataChart>

Please suggest how I can add the collection I got to the UsageCollection class, or an alternative for how to use it.

Ace McCloud
  • 798
  • 9
  • 27
  • 2
    _"As u can see I can static ally initialize it in the constructor"_ - are you sure? –  Sep 11 '15 at 23:56
  • i am setting the collections items in the constructor. – Ace McCloud Sep 11 '15 at 23:58
  • Well yes, but the constructor is not _static_ if that was your intention? Are you missing a `static` modifier? _"How can I assign that collection to this class?"_ - easy. Just add it as a member to `UsageStatistics` –  Sep 12 '15 at 00:16
  • u see the XAML there is a line : ? thats the only place the constructor gets called !! my collection class is only instantiated there. – Ace McCloud Sep 12 '15 at 01:08
  • so its weird how i cannot set it anywhere ? how can i add it as a member to UsageStatistics ? My UsageCollection class is a collection of items of type UsageStatistics. – Ace McCloud Sep 12 '15 at 01:09

3 Answers3

2

How can I assign that collection to this class?

To access a collection stored in XAML resource use FindResource()

var data = (UsageCollection)this.FindResource("data");

data.Clear();
data.Add(new UsageStatistics("A", 6, "1/2/2012"));
data.Add(new UsageStatistics("C", 8, "1/2/2012"));

BTW: Instead of using constructor you can embed the sample data in XAML:

<Window.Resources>
    <comboSourceCase:UsageCollection x:Key="data" >
        <comboSourceCase:UsageStatistics Alias="A" ActivityCount="3" Date= "1/2/2012"></comboSourceCase:UsageStatistics
        <comboSourceCase:UsageStatistics Alias="C" ActivityCount="8" Date= "1/2/2012"></comboSourceCase:UsageStatistics
    </comboSourceCase:UsageCollection> 
alexm
  • 6,854
  • 20
  • 24
0

UsageCollection does not encapsulate ObservableCollection<UsageStatistics>, it is inheriting. To encapsulate...

public class UsageCollection {
    protected ObservableCollection<UsageStatistics> theCollection;
}

Now that it is contained, we can inject a collection object via a constructor.

public UsageCollection ( ObservableCollection<UsageStatistics> someCollection );
radarbob
  • 4,964
  • 2
  • 23
  • 36
0

Following example demonstrates usage of your collection with a datagrid. Let me know if it solves your problem.

public partial class Win32533638 : Window
{
    public Win32533638()
    {
        InitializeComponent();

        DgrdUsageStatistics.ItemsSource = _getUsageStatisticsFromServer();
    }

    private UsageCollection _getUsageStatisticsFromServer()
    {
        UsageCollection items = new UsageCollection();
        items.Add(new UsageStatistics("D", 8, "1/2/2015"));
        items.Add(new UsageStatistics("A", 6, "1/2/2012"));

        return items;
    }
}

Your DataTemplate :

<Window.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid d:DesignWidth="295.187" d:DesignHeight="128.271" Height="76" Width="300">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="52*"/>
                    <ColumnDefinition Width="57*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="44*"/>
                    <RowDefinition Height="45*"/>
                    <RowDefinition Height="52*"/>
                </Grid.RowDefinitions>
                <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Alias" VerticalAlignment="Top" Width="119" Margin="5,5,0,5"/>
                <TextBlock HorizontalAlignment="Left" Grid.Row="1" TextWrapping="Wrap" Text="Date" VerticalAlignment="Top" Width="119" Margin="5,5,0,5"/>
                <TextBlock HorizontalAlignment="Left" Grid.Row="2" TextWrapping="Wrap" Text="Activity Count" VerticalAlignment="Top" Width="119" Margin="5,5,0,5"/>
                <TextBlock Grid.Column="1" HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Alias}" VerticalAlignment="Top" Margin="5,5,0,5"/>
                <TextBlock Grid.Column="1" HorizontalAlignment="Left" Grid.Row="1" TextWrapping="Wrap" Text="{Binding Date}" VerticalAlignment="Top" Margin="5,5,0,5"/>
                <TextBlock Grid.Column="1" HorizontalAlignment="Left" Grid.Row="2" TextWrapping="Wrap" Text="{Binding ActivityCount}" VerticalAlignment="Top" Margin="5,5,0,5"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>

Your XAML code :

<DataGrid x:Name="DrgUsageWithTemplate" Margin="0 10 0 0" ItemsSource="{StaticResource UsgCollection}" AutoGenerateColumns="False" ItemTemplate="{DynamicResource DataTemplate1}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Usage Statistical Data" CellTemplate="{StaticResource ResourceKey=DataTemplate1}">

                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
AnjumSKhan
  • 9,647
  • 1
  • 26
  • 38