2010-10-23 12 views
7

Ad esempio, è possibile associare una proprietà Text di Textblock a un elemento Nome [2] di tipo String?In C# e WPF, è possibile associare un elemento di una matrice a una proprietà di oggetti?

+1

Vuoi dire come associare Nome [2] per la proprietà di controllo declaretively in XAML? –

+0

Sì, questo è quello che intendo. Al momento, tuttavia, il collegamento funziona ma il controllo target non viene aggiornato quando viene modificata la variabile di origine. I'm stumped – Scifiballer24

risposta

12

io non sono sicuro di cosa si intende esattamente con queste parole: un nome di elemento [2] di tipo String, per cui qui sono due possibili soluzioni al tuo problema: Array1 e String1. Array1 mostra l'arco da associare all'elemento di un array e String1 mostra come visualizzare un singolo carattere in una stringa.

CODICE:

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> 

Speranza che aiuta.

+0

Grazie, questo funziona eccetto che l'aggiornamento dell'origine non aggiorna il controllo target. Ho provato tutto e non funziona fino ad ora. Dovrei usare una ObservableCollection? – Scifiballer24

+0

Poiché questo commento non consente di pubblicare un'altra risposta. –

1

se vuoi dire che se siamo in grado di legarsi oggetto array con textBox allora sì

<TextBox Margin="10" Text="{Binding Name[2], Mode=Default}" Name="textBox1"/> 
+0

TextBox non ha una proprietà Content. –

+0

scusa ... è un mio errore, grazie – Azhar

4

Sì, è possibile. Di seguito è l'approccio XAML. Si consiglia di associare a una raccolta Osservabile se si desidera aggiornare automaticamente l'IU quando il valore cambia.

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

XAML: Supponendo che il DataContext è impostato correttamente:

<TextBox Margin="5" Text="{Binding SomeNorthEasternStates[3], Mode=Default}"/> 
+0

C'è una ragione particolare per cui stai usando i metodi della classe 'Array' invece di fare semplicemente' var testArray = new string [5]; testarray [0] = "NY"; ... '. – Heinzi

+1

@Heinzi - O var testArray = new [] {"NH", "VT", "CT", "MA", "ME"}; (NY e NJ non sono nel New England) :) –

+0

@ John Bowen. Colpa mia. Cambiato il nome – SKG

3

Ho aggiunto un pulsante in xaml e l'evento "clic" sottoscritto.

Ecco il codice C#.

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")); 
    } 
} 
+0

Grazie. ObservableCollection implementa anche quelle funzioni e funziona perfettamente. Apprezzo il tuo aiuto klm_. – Scifiballer24

1

Uso ObservableCollection invece:

private ObservableCollection<string> _myItems = new ObservableCollection<string>(new[] { "test1", "test2", "test3" }); 

public ObservableCollection<string> MyItems 
{ 
    get { return _myItems; } 
    set { _myItems = value; } 
} 

Xaml

<StackPanel Orientation="Vertical"> 
     <TextBox Text="{Binding MyItems[0]}"/> 
     <TextBox Text="{Binding MyItems[2]}"/> 
     <TextBlock Text="{Binding MyItems[0]}"/> 
     <TextBlock Text="{Binding MyItems[1]}"/> 
    </StackPanel> 
Problemi correlati