Mam problem z określonym wiązaniem danych XAML. Mam dwa listboxes (master-details, więc listboxes mają wartość IsSynchronizedWithCurrentItem na true). Chcę, aby mój ViewModel, aby wiedzieć, kiedy wybrana pozycja na zmianach dane pola listy: Stworzyłem właściwość int na mojej klasie ViewModel (czyli możemy wywołać tę właściwość SelInd) oraz szczegóły ViewModel wiążę ten sposób:SelectedIndex z wiązaniem OneWayToSource nie wyzwala
SelectedIndex="{Binding Mode=OneWayToSource, Path=SelInd}"
Nie otrzymuję błędów/wyjątków w czasie wykonywania, ale powiązanie nie wyzwala: moja właściwość viewmodel nie jest aktualizowana po zmianie wybranego elementu. Jeśli zmienię tryb bindowania na TwoWay, wszystko działa dobrze, ale to nie jest to, czego potrzebuję. Potrzebuję go do pracy z OneWayToSource (btw to samo niestosowne zachowanie ma zastosowanie, jeśli wiążę właściwości SelectedItem do SelectedValue).
Dlaczego te wiązania nie działają z OneWayToSource?
Oto bardziej kompletny przykład kodu, aby uzyskać wyraźniejsze efekty: EDYCJA: Nie mogę wyświetlić prawdziwego kodu (NDA), ale pokażę tutaj coś prostszego i wystarczająco podobnego (Kontekst danych strony jest instancją opisanej później klasy PageViewModel) Po prostu potrzebuję, aby moja właściwość SelInd klasy viewmodel zawsze odzwierciedlała wartość SelectedIndex w drugim polu ListBox. Znalazłem alternatywne metody robienia tego (Event handler with code-behind lub Attached Behavior), ale teraz jestem po prostu ciekawy dlaczego nie działa z wiązaniem OneWayToSource.
<Page>
<ContentControl x:Name="MainDataContext">
<Grid DataContext={Binding Path=Masters}>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0"
SelectionMode="Single"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding }">
<ListBox.ItemContainerStyle>
...
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
....
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Grid.Column="1"
SelectionMode="Single"
SelectedIndex="{Binding Mode=OneWayToSource, ElementName=MainDataContext,Path=DataContext.SelInd}"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=Details}">
<ListBox.ItemContainerStyle>
...
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
....
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</ContentControl>
</Page>
Oto szkic klasy widok modelu
public class PageViewModel{
public ObservableCollection<MasterClass> Masters {get;set;}
public int SelInd {get;set;}
....
}
A oto MasterClass, to po prostu posiada nazwę i listę szczegółów
public class MasterClass{
public ObservableCollection<DetailsClass> Details {get;set;}
public String MasterName {get;set;}
....
}
try (updateSourceTriger = PropertyChanged) Część w swojej wiążące wiedzieć ..hope masz już zaimplementowane inotifypropertyChnahged..on you viewmodel .. – loop
dzięki tanuj_loop. Zapomniałem wspomnieć o tym w pytaniu: już próbowałem używać updateSourceTrigger, ale nic się nie zmieniło. W każdym razie mój viewmodel już implementuje INotifyPropertyChanged, ale myślę, że jest to przydatne tylko wtedy, gdy musisz powiadomić UI o zmianach viewmodelu, a nie odwrotnie. – Gufino2
co to jest MainDataContext? zaktualizuj kod viewmodel i pełny kod xaml ... i co właściwie chcesz osiągnąć .. – loop