2015-05-20 13 views
6

Próbuję przenieść moją aplikację Windows RT do WIndows10 i próbuję nowych wiązań x: Bind.Windows 10 x: Bind to SelectedItem

Do tej pory jestem w stanie powiązać moje właściwości ViewModel i inne Viewelements. Ale teraz próbuję powiązać tekst TextBox do SelectedItem z GridView.

W klasycznym wiązaniu robię to w ten sposób.

<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" 
          /> 

że próbuje go

  • Text = "{x bind gv_textgroup.SelectedItem.bezeich Mode = TwoWay}"
  • Text = "{x bind textgroup [gv_textgroup. SelectedIndex] .bezeich, Mode = TwoWay}”
    • gdzie textgroup jest mój viewmodelclass ze wszystkimi elementami

Ale nic z tego nie działało ... żadnych pomysłów?

Czy ktoś może mi wytłumaczyć, co zrobić z "DependencyProperty". Oglądałem viedo z "build 2015" i mam przykładowe kody. Ale to nic nie mówiąc do mnie ... Jestem zupełnie początkujących ...

Dziękujemy za pomoc

Odpowiedz

3

Nie można używać x: Bind na selectedItem z GridView. Jest tak dlatego, że SelectedItem jest obiektem, więc może to być cokolwiek. x: Bind musi mieć rzeczywiste klasy/interfejsy. x: Bind nie używa odbicia, aby znaleźć takie właściwości jak bindowanie.

Możesz to zrobić przez x: Przypisz SelectedItem GridView do swojego modelu widoku, a następnie x: Przywiąż to z TextBlock. Nie jestem pewien, czy to naprawdę pomogłoby w wykonaniu tak bardzo, jak byś chciał.

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

Obawiam się, że masz rację. Ale myślę, że to naprawdę szkoda, że ​​nie możesz rzucić z obiektu na swoją klasę. Mam nadzieję, że Microsoft ulepszy tę technikę, o czym wspomnieli podczas kompilacji (przypuszczam, że przeczytałem/usłyszałem ją w wideo). Dziękuję za poświęcony czas. – thezapper

+0

Jak oni mogą wiedzieć, co chcesz, aby obiekt był. x: Bind to dyrektywa dotycząca czasu kompilacji. Oznacza to, że utworzy kod w czasie kompilacji, który będzie wiązał się z twoim obiektem/właściwościami. Nie można oczekiwać, że kompilator będzie wiedział, że obiekt ma być typu MyObject. –

+0

Może coś takiego: thezapper

11

Nie jestem pewien, dlaczego to działa, ale jeśli utworzyć obiekt-obiekt, x:Bind konwerter pracuje dla dwukierunkowej konwersji na dowolnym 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; 
    } 
} 

I można go używać tak:

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

Specjalne podziękowania dla runceel dla swoich próbek publicznych.

Wyjaśnia to po japońsku: here.

+3

Działa, ponieważ gdy kompilator widzi konwerter dla wiązania, ignoruje fakt, że mogą występować konflikty typów i dopuszcza kod z ryzykiem wyjątku środowiska wykonawczego. –

Powiązane problemy