在ListBox按钮中访问ProgressBar

时间:2011-07-15 20:01:40

标签: windows-phone-7

我希望能够控制何时根据点击事件显示ProgressBar。通常这没关系,除了我不相信我可以访问ProgressBar,因为它嵌入了这个结构。

以下代码示例显示了我拥有的结构

     <ListBox Name="AudioListBox" Margin="12,0,0,0" Grid.Row="2" Width="396" HorizontalAlignment="Left" ItemsSource="{Binding Audio}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Button BorderThickness="0.0" Click="ChapterPlayerButtonClick" Style="{StaticResource ButtonStyle1}">
                                <StackPanel Name="ButtonsStackPanel" Margin="0,0,0,17">
                                    <TextBlock Foreground="{Binding ChapterForeground}" Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextLargeStyle}"/>
                                    <ProgressBar x:Name="MyProgressBar" Value="{Binding ChapterProgressPosition}" Visibility="Collapsed" 
                                                 IsIndeterminate="False" Foreground="{Binding ChapterForeground}" Width="300"  Background="Black" HorizontalAlignment="Left">
                                    </ProgressBar>
                                    <TextBlock Text="{Binding LineTwo}"  TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                </StackPanel>
                            </Button>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

在这个例子中,我希望能够更改此进度条的可见性,并将其绑定到我已设置的计时器更新。不幸的是,我无法找到一种方法来打开按钮单击上的进度条的可见性。

2 个答案:

答案 0 :(得分:0)

这是MVVM真正可以提供帮助的地方 - 您可能已经通过查看XAML获得了与ViewModel绑定的数据。

您可以通过更改ViewModel上的IsProgressBarVisible属性,向ViewModel发送消息以打开进度条。

然后,您可以使用VisibilityValueConverter绑定ViewModel中的此布尔值(请参阅Jeff Wilcox at this link for more details的帖子)。

<ProgressBar 
    x:Name="MyProgressBar" 
    Visibility="{Binding IsProgressBarVisible, Converter={StaticResource VisibilityConverter}}" 
    IsIndeterminate="{Binding IsIndeterminate}" 
    ...
</ProgressBar>

答案 1 :(得分:0)

如果要更新ItemTemplate中的绑定项,则需要更新绑定,因为您无法按名称引用此类项的实例。 (因为您不能有多个具有相同名称的项目。)
在Click事件处理程序中,您可以通过发件人访问viewmodel实例并操作那里的属性。

例如,每次点击/点击按钮时,以下内容都会增加进度条的值。

private void ChapterPlayerButtonClick(object sender, RoutedEventArgs e)
{
    ((sender as FrameworkElement).DataContext as ItemVm).ChapterProgressPosition++;
}

请注意,由于ProgressBar的“怪癖”,您需要启用TwoWay绑定以通过绑定更新Value

我相信你可以知道如何做其余的事。

如果你想改变它,你还需要绑定可见性。

作为替代解决方案,我将在ViewModel本身上使用RelayCommand替换按钮单击事件,以简化代码。然后,您可以将所有逻辑放在同一个位置,而不需要像上面的单击事件处理程序中那样进行所有转换。