Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Ustawianie SelectedItem za pomocą MVVM

Cześć, mam niewyobrażalnie ciężki orzech do zgryzienia. Siedziałem nad tym 3 godziny i nie poradziłem sobie. Chcę zrobić coś takiego:


myList.SelectedIndex = 2;


Tyle, że nie w code behind, a za pomocą XAML. Czyli, po załadowaniu się pozycji do listy chcę by był zaznaczony trzeci element.

Pod DataContext podłączam VM, przekazując mu listę obiektów. Jednakże ja chcę za pomocą VM ustawić SelectedIndex i zbindować tą informacje dla ListBox-a.

Coś takiego
SelectedItem={Binding SelectedItemNotifyProperty}


Jak to zrobić nie łamiąc wzorca MVVM?

Kod listy jest prosty.

<ListBox x:Name="myList" Margin="0,20,0,0" ItemsSource="{Binding ListItems}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock TextAlignment="Center" Text="{Binding Text}" Height="80">
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>


VM też jest prosty

public class MainScreenViewModel : NotifyProperty
{
public MainScreenViewModel()
{
this.ListItems = new ObservableCollection<SampleListItem>();
}

public void LoadData()
{
LoadData();
IsDataLoaded = true;
}

public bool IsDataLoaded
{
get;
private set;
}

public ObservableCollection<SampleListItem> ListItems { get; private set; }
public void LoadData()
{
this.ListItems.Add(new SampleListItem() { Text = "Katalog1" });
this.ListItems.Add(new SampleListItem() { Text = "Katalog2" });
}
}

Temat: Ustawianie SelectedItem za pomocą MVVM

Czesc,
Musi byc koniecznie SelectedIndex?
Takie cos rozwiazuje sie poprzez wystawienie wlasnosci na view modelu:

SampleListItem selectedListItem
public SampleListItem SelectedListItem
{
get
{
return selectedListItem;
}
set
{
selectedListItem=value;
//kod do zgloszenia PropertyChanged
}
}


A w widoku bindujesz wlasnosc SelectedItem z SelectedListItem.
Jesli w LoadData ustawisz SelectedListItem na pozadana wartosc, bedziesz mial co potrzebujesz.

I juz;>
Marcin Pasternak

Marcin Pasternak Programista .NET, C#

Temat: Ustawianie SelectedItem za pomocą MVVM

Cześć,
ja oprócz wspomnianego wcześniej podejścia czasami używam takiego (szczególnie gdy mam potrzebę filtrować, grupować,sortować):
ViewModel:
opakowuje listę w ICollectionView

private List<Person> personCollection;
public ViewModel()
{
personCollection = new List<Person>()
{
new Person() {Name="Tom", Age =20},
new Person() {Name="Jim", Age =30},
new Person() {Name="Anna", Age =50},
new Person() {Name="Martin", Age =25},
};

Persons = System.Windows.Data.CollectionViewSource.GetDefaultView(personCollection);
Persons.MoveCurrentToPosition(2);
}
public ICollectionView Persons
{
get;
set;
}


xaml:
Binduje listę do Person, przy czym należy ustawić znacznik IsSynchronizedWithCurrentItem="True"

<ListBox HorizontalAlignment="Left" Height="188" Margin="97,84,0,0" VerticalAlignment="Top" Width="197"
ItemsSource="{Binding Persons}"
ItemTemplate="{StaticResource PersonTemplate}" IsSynchronizedWithCurrentItem="True">
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Ustawianie SelectedItem za pomocą MVVM

Jacek Tomaka:
I juz;>

Ok. Dzięki, pomogło :)

Następna dyskusja:

UserControls w Silverlight ...




Wyślij zaproszenie do