views:

109

answers:

4

For example, is it possible to bind a Textblock's Text property to an element Name[2] of type String?

+1  A: 

if you mean that if we can bind array item with textBox then, yes

 <TextBox Margin="10" Text="{Binding Name[2], Mode=Default}"  Name="textBox1"/>
Azhar
TextBox doesn't have a Content property.
Jonathan Allen
sorry... its my mistake, thanks
Azhar
+2  A: 

Yes you can. Following is the XAML approach. It is advisable to bind to an Observable collection if you want to update the UI automatically when the value changes.

public class DataStub {

      public Array SomeNorthEasternStates
      {
          get
          {
               return new[] { "NH", "VT", "CT", "MA", "ME" };      
          }
      }
    }

XAML: Assuming the DataContext is set correctly

 <TextBox Margin="5"  Text="{Binding SomeNorthEasternStates[3], Mode=Default}"/>
SKG
Is there a particular reason why you are using the methods of the `Array` class instead of doing simply `var testArray = new string[5]; testarray[0] = "NY"; ...`.
Heinzi
@Heinzi - Or var testArray = new [] { "NH", "VT", "CT", "MA", "ME" }; (NY and NJ aren't in New England) :)
John Bowen
@John Bowen. My bad. Changed the name.
SKG
@Heinzi. No specific reason. See Edit. 7 hrs later with some sleep and coffee I am wondering why I did it that way. :)
SKG
A: 

I'm not sure what you mean exactly by saying:an element Name[2] of type String, so here are two possible solutions to your problem: Array1 and String1. Array1 show bow to bind to element of an array and String1 shows how to display one single character in a string.

CODE:

 public partial class MainWindow : Window
{
    private Array array1 = new[] {"test1", "test2", "test3"};
    public Array Array1 { get { return array1; } }

    public string string1 = "string";
    public string String1 { get { return string1; } }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }
}

XAML:<StackPanel Orientation="Vertical"> <TextBlock Text="{Binding Array1[0]}"/> <TextBlock Text="{Binding Array1[2]}"/> <TextBlock Text="{Binding String1[0]}"/> <TextBlock Text="{Binding String1[1]}"/> </StackPanel>

Hope that helps.

klm_
Thanks, this works except that updating the source doesn't update the target control. I've tried everything and it isn't working so far. Should I be using an ObservableCollection?
Scifiballer24
Since this comment doesn't allow I've posted another answer.
klm_
A: 

I've added a button in xaml and subscribed "click" event.

Here is C# code.

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private Array array1 = new[] { "test1", "test2", "test3" };
    public Array Array1 { get { return array1; } }


    public string string1 = "string";
    public string String1
    {
        get { return string1; }
        set
        {
            string1 = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("String1"));
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;

    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        String1 = DateTime.Now.ToString();
        array1.SetValue("another test", 0); 
        PropertyChanged(this, new PropertyChangedEventArgs("Array1"));
    }
}
klm_
Thanks. ObservableCollection implements those features as well and is working perfectly. I appreciate your help klm_.
Scifiballer24