Хороший способ реализовать логику, когда и элемент выбран в ListBox (MVVM) - PullRequest
2 голосов
/ 30 марта 2012

Так что я реализую MVVM (легкий инструментарий) в приложении Windows Phone.У меня есть ListBox, который SelectedItem привязан к свойству SelectedArticle.Здесь под (очень простым) свойством:

private Article _selectedArticle;
public Article SelectedArticle
{
    get { return _selectedArticle; }
    set
    {
            _selectedArticle = value;
            base.RaisePropertyChanged("SelectedArticle");
    }

}

Так что я хотел бы изменить представление, когда и элемент ListBox проверен.В любом случае, будет легко изменить представление в сеттете, но я бы хотел этого избежать.Так как это сделать?

Здесь xaml:

    <ListBox IsEnabled="{Binding ListBoxEnabled, Mode=TwoWay}" SelectedItem="{Binding SelectedArticle, Mode=TwoWay}" Opacity="{Binding Opacity, Mode=TwoWay}" ItemsSource="{Binding ArticlesList}" Height="634" Width="456">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image
                        Margin="0,15"
                        VerticalAlignment="Top"
                        Source="{Binding Image}"
                        Height="100"
                        Width="100" />
                    <StackPanel>
                        <TextBlock Margin="10,15" 
                                   Width="250"
                                   TextWrapping="Wrap"
                                   VerticalAlignment="Top"
                                   HorizontalAlignment="Left"
                                   FontSize="24"
                                   Text="{Binding Content}" />
                        <TextBlock Margin="20,0"
                                   Width="100"
                                   VerticalAlignment="Top"
                                   HorizontalAlignment="Left"
                                   FontSize="20"
                                   Text="{Binding Id}"/>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Хотите ли вы что-то вроде триггера взаимодействия?
Добавьте это к своему xaml

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Tap">
        <cmd:EventToCommand Command="{Binding EventTapCommand, Mode=OneWay}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

и затем определите RelayCommand в вашей ViewModel

public RelayCommand EventTapCommand { get; private set; }
public MainViewModel()
{
    EventTapCommand = new RelayCommand(DoSomeCoolStuff);
}

Если вам нужноВы также можете передать выбранный элемент из списка, вам просто нужно установить CommandParameter и определить RelayCommand, используя тип элемента.Я забыл точный синтаксис привязки.Что-то вроде:

<cmd:EventToCommand Command="{Binding EventTapCommand, Mode=OneWay}" CommandParameter="{Binding}"/>

public RelayCommand<MyType> EventTapCommand { get; private set; }
2 голосов
/ 30 марта 2012

Вы можете присоединить команду к одному из событий ListBox, используя поведение:

http://geekswithblogs.net/lbugnion/archive/2009/11/05/mvvm-light-toolkit-v3-alpha-2-eventtocommand-behavior.aspx

1 голос
/ 30 марта 2012

Взгляните на эту статью http://www.japf.fr/2009/03/thinking-with-mvvm-data-templates-contentcontrol/, она использует шаблоны данных wpf для отображения разных представлений в зависимости от свойства привязки к данным.

...