2011-07-15 3 views
2

Clickイベントに基づいてProgressBarをいつ表示するかを制御できます。通常、この構造で入れ子になっているので、ProgressBarにアクセスできるとは思わないことを除いて、これは問題ありません。ボタンのListBox内で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> 

をお持ちの構造を示し、それは私が持っているタイマーで更新に結合し、私はこのプログレスバーのvisbilityを変更できるようにするだけでなく、セットアップ。残念ながら、私はボタンのクリックで進捗バーの可視性をオンにする方法を見つけることができません。

答えて

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> 
0

ItemTemplate内のバインドされたアイテムを更新する場合は、そのアイテムのインスタンスを名前で参照することはできないため、バインディングを更新する必要があります。
Clickイベントハンドラでは、送信側からviewmodelインスタンスにアクセスし、そのプロパティを操作することができます(同じ名前の複数の項目を持つことはできません)。

たとえば、次の例では、ボタンをタップ/クリックするたびにプログレスバーの値がインクリメントされます。

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

によるプログレスバーの「癖」にあなたがの結合を介してValueを更新するために結合TwoWayを有効にする必要がありますので注意してください。

残りの作業の仕方は分かります。

これも変更したい場合は、Visibilityをバインドする必要があります。

代わりのソリューションとして、コードを単純化するために、ボタンのクリックイベントをViewModel自体のRelayCommandに置き換えます。すべてのロジックを同じ場所に配置し、上のクリックイベントハンドラのようにすべてのキャストを必要としないようにすることができます。

関連する問題