我希望能够控制何时根据点击事件显示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>
在这个例子中,我希望能够更改此进度条的可见性,并将其绑定到我已设置的计时器更新。不幸的是,我无法找到一种方法来打开按钮单击上的进度条的可见性。
答案 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替换按钮单击事件,以简化代码。然后,您可以将所有逻辑放在同一个位置,而不需要像上面的单击事件处理程序中那样进行所有转换。