2013-01-07 15 views
6

Ero curioso mentre stavo imparando di più sull'associazione con WPF DEVI impostare il contesto dei dati per impostare semplicemente il {binding path =} di una singola proprietà? Ero solo curioso mentre stavo imparando dall'esempio MVVM di codice retrostante e sembra che io abbia una situazione che voglio legare a qualcosa non nel contesto dei dati del ViewModel e preferirei una classe intermedia sul codice che sta dietro al riferimento in un rilegatura. Quindi potrei avere ancora un'altra classe di riferimento per un secondo datacontext o qualcosa di simile? O potrei impostare una chiave di risorsa e fare riferimento alla classe in qualche modo? Alla fine voglio accedere a una proprietà in una classe separata, se possibile.Associazione di una proprietà da una classe a XAML direttamente

EG:

<Window x:Class="WPFTestBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:da="clr-namespace:WPFTestBinding.DataAccess" 
     xmlns:main="clr-namespace:WPFTestBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <Label Content="Here we go: "/> 
      <TextBox x:Name="testtext" /> 
      <Label Height="50" /> 
      <!-- CODE BELOW WILL NOT WORK --> 
      <TextBox Text="{Binding Path=TestID}" x:Name="testtext2" /> 
     </StackPanel> 
    </Grid> 
</Window> 

So che posso impostare il valore di un controllo TextBox in codice dietro e funziona nell'esempio di una proprietà, ma non lo farà per l'associazione. C'è un modo per fare semplici collegamenti al volo per le proprietà delle classi? Non ho trovato un semplice esempio che faccia questo e stavo cercando online e mentre imparavo a legare la maggior parte degli esempi sono insiemi molto intensi di contesti dati di impostazioni o esempi di risorse statiche molto semplici. Ero solo curioso di poter usare {Binding Path =} ed estendere altre proprietà al volo per ottenere il codice nella classe.

Resto del codice è piuttosto semplice:

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
    {  
     public MainWindow() 
     { 
      InitializeComponent(); 

      DataAccess.Test t = new Test(); 

      testtext.Text = t.TestID; // code behind works easily 
     } 
    } 

risposta

9

È possibile impostare il DataContext in XAML come questo:

<Window xmlns:da="clr-namespace:WPFTestBinding.DataAccess"> 
    <Window.DataContext> 
     <da:Test/> 
    <Window.DataContext> 

    <TextBox Text="{Binding TestID}"/> 
</Window> 
+0

che è esattamente quello che stavo cercando. Sapevo che esisteva un metodo semplice per estendere lo spazio dei nomi nella XAML che mi mancava. – djangojazz

+0

@ kusi581, anche tu risolvi il mio problema. –

5

il contesto dati non è impostata. DataBinding non sa da dove prendere TestID da. Ecco il codice corretto dietro:

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataAccess.Test t = new Test(); 

     DataContext = t;   
    } 
} 
7

Alcuni punti da notare:

  • La proprietà TestID si sta cercando di legare è sola lettura, in quanto solo ha accesso. Pertanto, l'associazione deve essere solo OneWay.
  • Assegnazione di DataContext: è possibile assegnare l'istanza contenente il modello come MainViewModel con ICollection <BaseViewModel> proprietà (che avrebbe tutte le istanze derivate nell'insieme) o direttamente il modello stesso (come nel tuo caso). Come ho fatto nel codice qui sotto.

Codice

namespace WPFTestBinding.DataAccess 
{ 
    class Test 
    { 
     public string TestID { get { return "This is my test"; } } 
    } 
} 

public partial class MainWindow : Window 
{  
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataAccess.Test testInstance = new Test(); 
     this.DataContext = testInstance; 
    } 
} 

XAML

<TextBox Text="{Binding Path=TestID, Mode=OneWay}" x:Name="txtTestID" /> 

Per maggiori riferimento:

+0

Grandi punti, per il mio esempio non ero preoccupato di dover aggiungere un metodo "set" alla mia proprietà ma a volte conta. Grazie per aver aggiunto le informazioni sulla Modalità. Ho esaminato i due primi collegamenti che hai fornito in precedenza, ma i due collegamenti su DataContext che hai fornito sono molto buoni. – djangojazz

Problemi correlati