在ListBox(MVVM)中选择何时和项目时实现逻辑的好方法

时间:2012-03-30 13:35:41

标签: c# windows-phone-7 mvvm mvvm-light windows-phone

所以我在windows phone应用程序中实现了MVVM(light toolkit)。 我有一个ListBox,SelectedItem绑定到属性SelectedArticle。 下面是(非常简单的)属性:

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

}

所以我想要的是更改视图,检查ListBox的元素和元素。 无论如何,将视图的更改放在settet中会很容易,但我想避免这种情况。那怎么办呢?

这里是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 个答案:

答案 0 :(得分:3)

你想要一个像交互触发器这样的东西吗? 将其添加到您的xaml

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

然后在ViewModel中定义RelayCommand

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; }

答案 1 :(得分:2)

您可以使用以下行为将命令附加到其中一个ListBox事件:

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

答案 2 :(得分:1)

看看这篇文章http://www.japf.fr/2009/03/thinking-with-mvvm-data-templates-contentcontrol/,它使用wpf datatemplates根据数据绑定属性显示不同的视图。