Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. WPF
  4. Editing items in a bound ListBox?

Editing items in a bound ListBox?

Scheduled Pinned Locked Moved WPF
wpfquestioncsharpwcfcom
18 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D David Veeneman

    Thanks, but I pasted your code and markup into a WPF project, and I still have the same problem. I have pasted my complete code and markup below. What I want to do is implement two-way binding between the listbox and the textbox; i.e., click on a listbox item and have it appear in the textbox. Then, edit the item in the textbox and have the changes propogated back to the list box. If the listbox ItemsSource property is bound to a DataContext, two-way databinding between the listbox and the textbox doesn't work--it's only one way, from the listbox to the textbox. To see what I mean, remove the ItemsSource binding from the listbox, then add the four PlayList strings to the listbox using the Designer's Items property. Change the textbox binding path to SelectedValue.Content, and run. You will have two-way binding between the textbox and the listbox. Edit the textbox, and the changes appear in the listbox. Now, restore the original code. The textbox-listbox binding is now only one-way--from the listbox to the textbox. Changes in the textbox are not propagated back to the listbox. That brings me back to my original question: Is there any way to implement two-way binding between the textbox and the listbox, while maintaining the listbox ItemsSource binding to the PlayList object? My markup:

    <Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
    <TextBox Text="{Binding ElementName=playlists, Path=SelectedValue.Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <ListBox Name="playlists" SelectionMode="Single">
    <ListBoxItem>a</ListBoxItem>
    <ListBoxItem>b</ListBoxItem>
    <ListBoxItem>c</ListBoxItem>
    <ListBoxItem>d</ListBoxItem>
    </ListBox>
    <!-- ItemsSource="{Binding Path=Files}" -->
    </StackPanel>
    </Window>

    My code:

    using System.Windows;
    using System.Collections.ObjectModel;

    namespace WpfApplication1
    {
    public partial class Window1 : Window
    {
    private PlayList _playlist = new PlayList();
    public Window1()
    {
    InitializeComponent();
    playlists.DataContext = _playlist;
    }
    }

    public class PlayList 
    { 
        public Observable
    
    A Offline
    A Offline
    ABitSmart
    wrote on last edited by
    #5

    My apologies, I misintepreted your question. Updated the code snippet, hopefully I have got you correct this time. XAML,

    <TextBox Text="{Binding ElementName=playlists, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <ListBox Name="playlists" ItemsSource="{Binding Path=Files}" SelectionMode="Single">
    <ListBox.ItemTemplate>
    <DataTemplate>
    <TextBlock Text="{Binding Name}"/>
    </DataTemplate>
    </ListBox.ItemTemplate>
    </ListBox>

    Code,

    public class MyFile
    {
    public string Name { get; set; }
    }

    public class Playist
    {
    public ObservableCollection Files { get; set; }

    public Playist()
    {
        Files = new ObservableCollection();
        Files.Add(new MyFile { Name = "a" });
        Files.Add(new MyFile { Name = "b" });
        Files.Add(new MyFile { Name = "c" });
        Files.Add(new MyFile { Name = "d" });
    }
    

    }

    public partial class Window1 : Window
    {
    private PlayList _playlist = new PlayList();
    public Window1()
    {
    InitializeComponent();
    playlists.DataContext = _playlist;
    }
    }

    Is this what you are trying to sort out ?

    1 Reply Last reply
    0
    • D David Veeneman

      Post deleted because it's wrong. ABitSmart came up with the solution. David Veeneman Foresight Systems

      David Veeneman www.veeneman.com

      modified on Wednesday, March 25, 2009 11:22 AM

      A Offline
      A Offline
      ABitSmart
      wrote on last edited by
      #6

      I was writing my reply while you posted this. Well, yes, you can use one of the two, not both at a time. In your case, using ItemsSource renders Items readonly. But you can modify ItemsSource. The example I posted does that.

      D 1 Reply Last reply
      0
      • A ABitSmart

        I was writing my reply while you posted this. Well, yes, you can use one of the two, not both at a time. In your case, using ItemsSource renders Items readonly. But you can modify ItemsSource. The example I posted does that.

        D Offline
        D Offline
        David Veeneman
        wrote on last edited by
        #7

        Brilliant! Works like a champ. Thanks for your help on this. I cleaned up the code just a bit--complete code and XAML is posted below. XAML:

        <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <StackPanel>
        <TextBox Text="{Binding ElementName=playlists, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <ListBox Name="playlists" ItemsSource="{Binding Path=Files}" SelectionMode="Single">
        <ListBox.ItemTemplate>
        <DataTemplate>
        <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
        </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Show file list from DC" Click="Button_Click" />
        </StackPanel>
        </Window>

        Code:

        using System.Windows;
        using System.Collections.ObjectModel;
        using System.Text;

        namespace WpfApplication1
        {
        public partial class Window1 : Window
        {
        private PlayList _playlist = new PlayList();
        public Window1()
        {
        InitializeComponent();
        playlists.DataContext = _playlist;
        }

            private void Button\_Click(object sender, RoutedEventArgs e)
            {
                StringBuilder sb = new StringBuilder();
                foreach (MyFile file in \_playlist.Files)
                {
                    sb.Append(file.Name + " ");
                }
                MessageBox.Show(sb.ToString());
            }
        }
        
        public class MyFile 
        { 
            public string Name { get; set; } 
        }
        
        public class PlayList 
        {
            public ObservableCollection<MyFile> Files { get; set; }
        
            public PlayList() 
            {
                Files = new ObservableCollection<MyFile>();
                Files.Add(new MyFile { Name = "a" });
                Files.Add(new MyFile { Name = "b" });
                Files.Add(new MyFile { Name = "c" });
                Files.Add(new MyFile { Name = "d" }); 
            } 
        }
        

        }

        David Veeneman www.veeneman.com

        A 1 Reply Last reply
        0
        • D David Veeneman

          Brilliant! Works like a champ. Thanks for your help on this. I cleaned up the code just a bit--complete code and XAML is posted below. XAML:

          <Window x:Class="WpfApplication1.Window1"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Window1" Height="300" Width="300">
          <StackPanel>
          <TextBox Text="{Binding ElementName=playlists, Path=SelectedItem.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
          <ListBox Name="playlists" ItemsSource="{Binding Path=Files}" SelectionMode="Single">
          <ListBox.ItemTemplate>
          <DataTemplate>
          <TextBlock Text="{Binding Name}"/>
          </DataTemplate>
          </ListBox.ItemTemplate>
          </ListBox>
          <Button Content="Show file list from DC" Click="Button_Click" />
          </StackPanel>
          </Window>

          Code:

          using System.Windows;
          using System.Collections.ObjectModel;
          using System.Text;

          namespace WpfApplication1
          {
          public partial class Window1 : Window
          {
          private PlayList _playlist = new PlayList();
          public Window1()
          {
          InitializeComponent();
          playlists.DataContext = _playlist;
          }

              private void Button\_Click(object sender, RoutedEventArgs e)
              {
                  StringBuilder sb = new StringBuilder();
                  foreach (MyFile file in \_playlist.Files)
                  {
                      sb.Append(file.Name + " ");
                  }
                  MessageBox.Show(sb.ToString());
              }
          }
          
          public class MyFile 
          { 
              public string Name { get; set; } 
          }
          
          public class PlayList 
          {
              public ObservableCollection<MyFile> Files { get; set; }
          
              public PlayList() 
              {
                  Files = new ObservableCollection<MyFile>();
                  Files.Add(new MyFile { Name = "a" });
                  Files.Add(new MyFile { Name = "b" });
                  Files.Add(new MyFile { Name = "c" });
                  Files.Add(new MyFile { Name = "d" }); 
              } 
          }
          

          }

          David Veeneman www.veeneman.com

          A Offline
          A Offline
          ABitSmart
          wrote on last edited by
          #8

          Glad to be of help :)

          U 2 Replies Last reply
          0
          • A ABitSmart

            Glad to be of help :)

            U Offline
            U Offline
            User 3671134
            wrote on last edited by
            #9

            Hi, I am facing the similar kind of issue. But I am actually changing the controTemplate of ListBoxItem itself with ContentPresenter & a TextBox. Did the same thing as per the posted contents but it did not work with the binded list. I have given something like below in the ControlTemplate of ListBox Item. ; Kindly suggest.

            A 1 Reply Last reply
            0
            • U User 3671134

              Hi, I am facing the similar kind of issue. But I am actually changing the controTemplate of ListBoxItem itself with ContentPresenter & a TextBox. Did the same thing as per the posted contents but it did not work with the binded list. I have given something like below in the ControlTemplate of ListBox Item. ; Kindly suggest.

              A Offline
              A Offline
              ABitSmart
              wrote on last edited by
              #10

              You code did not come through.

              U 2 Replies Last reply
              0
              • A ABitSmart

                Glad to be of help :)

                U Offline
                U Offline
                User 3671134
                wrote on last edited by
                #11

                Hi, I am facing the similar kind of issue. But I am actually changing the controTemplate of ListBoxItem itself with ContentPresenter & a TextBox. I did the same thing as per the posted contents but it did not work with the binded list. I have given something like below in the ControlTemplate of ListBox Item. <ContentPresenter x:Name="displayTextBlock" Grid.Column="0" Grid.ColumnSpan="1" Margin="11,5,11,5" HorizontalAlignment="Stretch"/> <TextBox x:Name="listItemTextBox" Padding="11,5,11,5" HorizontalAlignment="Stretch"                                                                                           Background="Transparent"                                                                                           Grid.Column="0"                                                                                           Visibility="Collapsed" Grid.ColumnSpan="1"                                                                                        Text="{Binding Path=Content, ElementName=displayTextBlock, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> Kindly suggest. Thnx, Ritesh

                1 Reply Last reply
                0
                • A ABitSmart

                  You code did not come through.

                  U Offline
                  U Offline
                  User 3671134
                  wrote on last edited by
                  #12

                  See if it appears perfectly now.. Hi, I am facing the similar kind of issue. But I am actually changing the controTemplate of ListBoxItem itself with ContentPresenter & a TextBox. I did the same thing as per the posted contents but it did not work with the binded list. I have given something like below in the ControlTemplate of ListBox Item. <ContentPresenter x:Name="displayTextBlock" Grid.Column="0" Grid.ColumnSpan="1" Margin="11,5,11,5" HorizontalAlignment="Stretch"/> <TextBox x:Name="listItemTextBox" Padding="11,5,11,5" HorizontalAlignment="Stretch"                                                                                           Background="Transparent"                                                                                           Grid.Column="0"                                                                                           Visibility="Collapsed" Grid.ColumnSpan="1"                                                                                        Text="{Binding Path=Content, ElementName=displayTextBlock, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> Kindly suggest. Thnx, Ritesh

                  A 1 Reply Last reply
                  0
                  • A ABitSmart

                    You code did not come through.

                    U Offline
                    U Offline
                    User 3671134
                    wrote on last edited by
                    #13

                    Actually TextBox will be hidden & will be visible on DoubleClick. At that time, I want the content of ListBox item to be modified in Textbox & after lostfocus of TextBox, it should update ListBox Item & again becomes hidden. This works for unbound list but for bound list, I need your suggestions.

                    A 1 Reply Last reply
                    0
                    • U User 3671134

                      See if it appears perfectly now.. Hi, I am facing the similar kind of issue. But I am actually changing the controTemplate of ListBoxItem itself with ContentPresenter & a TextBox. I did the same thing as per the posted contents but it did not work with the binded list. I have given something like below in the ControlTemplate of ListBox Item. <ContentPresenter x:Name="displayTextBlock" Grid.Column="0" Grid.ColumnSpan="1" Margin="11,5,11,5" HorizontalAlignment="Stretch"/> <TextBox x:Name="listItemTextBox" Padding="11,5,11,5" HorizontalAlignment="Stretch"                                                                                           Background="Transparent"                                                                                           Grid.Column="0"                                                                                           Visibility="Collapsed" Grid.ColumnSpan="1"                                                                                        Text="{Binding Path=Content, ElementName=displayTextBlock, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" /> Kindly suggest. Thnx, Ritesh

                      A Offline
                      A Offline
                      ABitSmart
                      wrote on last edited by
                      #14

                      It won't work because you are binding the TextBox to the ContentPresenter. There is no binding to your data element at all.

                      U 1 Reply Last reply
                      0
                      • A ABitSmart

                        It won't work because you are binding the TextBox to the ContentPresenter. There is no binding to your data element at all.

                        U Offline
                        U Offline
                        User 3671134
                        wrote on last edited by
                        #15

                        This is a custom control. In window, ItemSource of this control is bind to a collection Object. Do you suggest some other approach for this.

                        A 1 Reply Last reply
                        0
                        • U User 3671134

                          Actually TextBox will be hidden & will be visible on DoubleClick. At that time, I want the content of ListBox item to be modified in Textbox & after lostfocus of TextBox, it should update ListBox Item & again becomes hidden. This works for unbound list but for bound list, I need your suggestions.

                          A Offline
                          A Offline
                          ABitSmart
                          wrote on last edited by
                          #16

                          You should try something like this Link[^]

                          1 Reply Last reply
                          0
                          • U User 3671134

                            This is a custom control. In window, ItemSource of this control is bind to a collection Object. Do you suggest some other approach for this.

                            A Offline
                            A Offline
                            ABitSmart
                            wrote on last edited by
                            #17

                            But you have not bound any property of the collection to the ListBox item. How do you expect the collection to change?

                            U 1 Reply Last reply
                            0
                            • A ABitSmart

                              But you have not bound any property of the collection to the ListBox item. How do you expect the collection to change?

                              U Offline
                              U Offline
                              User 3671134
                              wrote on last edited by
                              #18

                              Hi, We are doing the binding as below: <eclp:EclpList   Name="eclpList" Margin="5" Height="Auto" Width="100" ItemsSource="{Binding}" DisplayMemberPath="Name" SelectionChanged="cmb_SelectionChanged"   /> See if this can give any ideas.. Thnx Ritesh

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups