2015-05-20 7 views
6

Sto provando a portare/adottare la mia app Windows RT su Windows10 e sto provando i nuovi binding x: Bind.Windows 10 x: Collega a SelectedItem

Finora sono in grado di eseguire il binding alle proprietà ViewModel e ad altri Viewelements. Ma ora sto cercando di associare il testo di un TextBox a un oggetto selezionato di un GridView.

In rilegatura classica lo sto facendo così.

<TextBox x:Name="tb_textgroup" 
          Grid.Row="1" 
          PlaceholderText="Change Groupname" 
          Text="{Binding UpdateSourceTrigger=PropertyChanged, 
            ElementName=gv_textgroup, 
            Mode=TwoWay,Path=SelectedItem.bezeich}" 
          IsEnabled="{Binding UpdateSourceTrigger=PropertyChanged, 
             ElementName=gv_textgroup, 
             Mode=TwoWay,Path=SelectedItem.edit_activated}" 
          Margin="20,10,20,0" 
          /> 

Stavo cercando con

  • Text = "{x: Bind gv_textgroup.SelectedItem.bezeich, Mode = TwoWay}"
  • Text = "{x: Bind textgroup [gv_textgroup. SelectedIndex] .bezeich, Mode = TwoWay}"
    • dove textgroup è il mio viewmodelclass con tutti gli elementi

Ma niente ha funzionato ... qualche idea?

E qualcuno può spiegarmi cosa fare con "DependencyProperty". Ho visto il viedo da "build 2015" e ho i codici di esempio. Ma che sta dicendo nulla per me ... Sono un novizio abbastanza ...

Molte grazie per il vostro aiuto

risposta

3

Non è possibile utilizzare x: Bind sulla SelectedItem di un GridView. Questo perché l'oggetto SelectedItem è un oggetto, quindi può essere qualsiasi cosa. x: Bind deve avere classi/interfacce effettive. x: Bind non usa il reflection per trovare proprietà come Binding.

È possibile eseguire ciò tramite x: Associare l'oggetto selezionato di GridView al modello di visualizzazione e quindi x: eseguire il binding a tale da TextBlock. Non sono sicuro che ciò possa davvero aiutare le prestazioni quanto vorresti.

public class ViewModel 
{ 
    public MyItem SelectedItem { get; set; } //fire prop changed 
} 

<GridView SelectedItem="{x:Bind SelectedItem, mode=Twoway}"/> 
<TextBlock Text="{x:Bind ViewModel.SelectedItem.bezeich}" 
+0

Ho paura che tu abbia ragione. Ma penso che questo sia davvero un peccato che tu non possa trasmettere da un oggetto alla tua classe. Spero comunque che Microsoft migliorerà questa tecnica come hanno menzionato su build (ho pensato di averlo letto/ascoltato in un video). Grazie per il tuo tempo – thezapper

+0

Come possono sapere che cosa vuoi che sia l'oggetto. x: Bind è una direttiva del tempo di compilazione. Ciò significa che creerà il codice in fase di compilazione che si lega al tuo oggetto/proprietà. Non ci si può aspettare che il compilatore sappia che si desidera che un oggetto sia di tipo MyObject. –

+0

Forse qualcosa del genere: thezapper

11

non sono sicuro perché questo funziona, ma se si crea un convertitore oggetto-oggetto, x:Bind lavori per la conversione bidirezionale su qualsiasi SelectedItem.

public class NoopConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return value; 
    } 
} 

E si può usare in questo modo:

<ListView ItemsSource="{x:Bind ViewModel.Items}" 
     SelectedItem="{x:Bind ViewModel.SelectedItem, Mode=TwoWay, Converter={StaticResource NoopConverter}}" 
     ... 

Un ringraziamento speciale a runceel per i suoi campioni pubblici.

Lui lo spiega here in giapponese.

+3

Funziona perché quando il compilatore vede che c'è un convertitore per l'associazione, ignora il fatto che potrebbero esserci conflitti di tipi e consente al codice di correre il rischio di un'eccezione di runtime. –