简体   繁体   中英

Stackpanel/Itemscontrol Databinding

I have this XAML:

 <ItemsControl x:Name="recentSearches"
               Margin="0,65,0,0">
               <ItemsControl.ItemsPanel>
                   <ItemsPanelTemplate>
                         <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                         <TextBlock Text="{Binding q}"
                                TextWrapping="Wrap"
                                Foreground="AliceBlue"
                                Padding="2,6,2,2"
                                Margin="12,-6,12,0"
                                FontSize="20" />
                      </DataTemplate>
                 </ItemsControl.ItemTemplate>

and this code behind:

private void showLatestSearches()
        {
            if (fmn.checkLatestSearchesExtistence())
            {
                List<RecentSearchItem> recent = new List<RecentSearchItem>();
                List<String> l = fmn.readLatestSearches();
                for (int i = 0; i <= l.Count-1; i += 1)
                {
                    RecentSearchItem r = new RecentSearchItem();
                    r.q = l[i];
                    r.generalbg = grau;
                    recent.Add(r);
                }
                recentSearches.DataContext = recent;
            }
        }

the object called fmn reads a .txt from the isolated storage. But why doesn't anything show up with this StackPanel?

ItemsControl.ItemsSource has to be bound to a collection, for notifications the best would be ObservableCollection<T> .

You are setting the DataContext at the last possible minute, a better way would be to set DataContext to a ViewModel, could be place where you create your View.

public class Form :UserControl
{
  DataContext = new YourViewModel() ;
}

In XAML:

ItemsSource="{Binding SearchesCollection}"

SearchesCollection would be a property in YourViewModel of type ObservableCollection<string> . Whenever you add a new item to SearchesCollection the View updates.

This Databinding Tutorial should help.

Thanks to Lews Therin I managed to finally bind my data to the stackpanel:

<ItemsControl x:Name="recentSearches"
              ItemsSource="{Binding recent}"
              Background="{Binding generalbg}"
              Margin="0,65,0,0" Tap="recentSearches_Tap">
                    <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding q}"
                                               Foreground="{Binding foreground}"
                                               TextWrapping="Wrap"
                                               Padding="2,6,2,2"
                                               Margin="12,-6,12,0"
                                               FontSize="20" />
                     </DataTemplate>
                            </ItemsControl.ItemTemplate>
 </ItemsControl>

and the code behind:

private void showLatestSearches()
{
    if (fmn.checkLatestSearchesExtistence())
    {
        List<RecentSearchItem> recent = new List<RecentSearchItem>();
        List<String> l = fmn.readLatestSearches();
        for (int i = 0; i <= l.Count-1; i += 1)
        {
            RecentSearchItem r = new RecentSearchItem();
            r.q = l[i];
            r.generalbg = grau;
            r.foreground = blau;
            recent.Add(r);
        }
        recentSearches.ItemsSource = recent;
    }
}

this works, but unfortunately there seems to be no way to determine, which TextBox is tapped, when one is tapped.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM