简体   繁体   中英

Control inside datatemplate in ListBox UWP xaml

I have a ListBox consist of Datatemplate. Here is my code:

<ListBox x:Name="MyListBox" SelectionChanged="MyListBox_SelectionChanged_1"  SelectionMode="Single" IsItemClickEnabled="True">
<ListBox.ItemTemplate>
    <DataTemplate>
       <Rectangle Width="50" Height="45" Name="myRectangle"  Fill="DodgerBlue" />
       <Ellipse Grid.Column="0" Fill="LightGreen" Height="22" Width="22" />
       <TextBlock Text="{Binding Initials}" x:Name="PersonInitials" />
       <stackpanel>
       <TextBlock TextWrapping="Wrap" x:Name="person_lbl" Text="{Binding SourceLink}" Foreground="DodgerBlue"/>
       <TextBlock TextWrapping="Wrap" x:Name="detail_lbl" Text="{Binding ConversationId}" Foreground="DarkSlateGray"/>
       </StackPanel>
      <ToggleSwitch OffContent=" "/>
   </DataTemplate>           
</ListBox.ItemTemplate>
</ListBox> 

Datatemplate consist of rectangle,Ellipse,3 textblocks and toggle switch which finally give an output like this as shown in image. This is the template I will get.Please ignore the search bar. Now Here is my Query:

I want to perform action on the basis of selection of a data_template in the listBox in which it should fetch the text of the textbox and display it somewhere.After searching about it on internet I have only found the examples like

<listbox>item1</listbox>

My ListBox does not consist of only one item it has many items that is making a template. How can I fetch one textbox element on selection of whole template.Does anyone has idea how do so? This is my code in c#:

    class ReadJsonData
    {
        public List<Information> information { get; set; }
        public ReadJsonData()
        {
            information = new List<Information>();

        }
    }
    public class Information
    {
        public string SourceLink { get; set; }
        public int ConversationId { get; set; }
        public string Initials { get; set; }
    }
 and this is on MainPage.xaml
    public MainPage()
        {
            this.InitializeComponent();
            JsonReader();

        }
        public async void JsonReader()
        {
            Information infos = new Information();
            infos.ConversationId = 1122;
            infos.Initials = "LM";
            infos.SourceLink = "abc";
            Information info1 = new Information();
            info1.ConversationId = 111;
            info1.Initials = "MM";
            info1.SourceLink = "pqr";
            Information info2 = new Information();
            info2.ConversationId = 1113;
            info2.Initials = "NM";
            info2.SourceLink = "vrl";
            ReadJsonData rb = new ReadJsonData();
            rb.information.Add(infos);
            rb.information.Add(info1);
            rb.information.Add(info2);
            var rb1 = JsonConvert.SerializeObject(rb);
            var rootobject = JsonConvert.DeserializeObject<ReadJsonData>(rb1);

            foreach (var info in rootobject.information)
            {
                MyListBox.ItemsSource = rootobject.information;

            }
        private void MyListBox_SelectionChanged(object sender,
        SelectionChangedEventArgs e)
        {
            var selectedItem = sender as Information;
            string initials = selectedItem.Initials;
            show_initial = initials;
        }
        }

Assuming you are setting the item source of the ListBox (MyListBox) to a list of items of your model class ( List<SomeClassName> )..

If your model class is something like this :

public class SomeClassName
    {
        public string Initials { get; set; }
        public string SourceLink { get; set; }
        public string ConversationId { get; set; }
    }

You can add this code to the OnSelectionChanged or Tapped event of your listbox to get the data members of the class:

private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ 
   var selectedItem = sender as SomeClassName;
   //Gives you the Initials of the selected list item
   string intials = selectedItem.Initials;
}

Hope this helps..!


EDIT 1 :

First of all why are you iterating rootobject.information ? you can simply use it as item source without the for loop..

foreach (var info in rootobject.information)
{
   MyListBox.ItemsSource = rootobject.information;    
}

Second, what does this line do ? show_initial = initials; is show_initial a variable ? what does it do ?


Edit 2 :

private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ 
    if(MyListBox.SelectedItem != null)
    {
      var selectedItem = sender as Information;
      //Gives you the Initials of the selected list item
      string intials = selectedItem.Initials;
    } else {
      Debug.WriteLine("No item Selected");
    }
}

Please check if the MyListBox.SelectedItem != null condition is satisfied or not.

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