2017-09-06 4 views
-3

私はxamlコードで2つのボタンのVisiblityをバインドしています。再生/一時停止ボタンを使用しようとしています。再生ボタンをクリックしてから一時停止ボタンを表示し、これが最善の方法であるかどうかは完全にはわかりませんが、うーん、もしうまくいくなら、私たちは良いです!ここXAML可視性バインディングが動作しない

:ここ

<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Grid Width="50" Height="50" VerticalAlignment="Center" HorizontalAlignment="Center"> 
      <Button x:Name="PlayButton" Style="{DynamicResource MetroCircleButtonStyle}" Visibility="{Binding PlayButtonVisibility}" 
        Width="50" Height="50" HorizontalAlignment="Center" 
        VerticalAlignment="Center" Click="OnPlayButtonClicked" 
        d:DataContext="{d:DesignInstance local:MainWindow}"> 
       <Rectangle Width="20" 
          Height="20"> 
        <Rectangle.Fill> 
         <VisualBrush Stretch="Fill" 
            Visual="{StaticResource appbar_control_play}" /> 
        </Rectangle.Fill> 
       </Rectangle> 
      </Button> 

      <Button x:Name="PauseButton" Style="{DynamicResource MetroCircleButtonStyle}" Visibility="{Binding PauseButtonVisibility}" 
        Width="50" Height="50" HorizontalAlignment="Center" 
        VerticalAlignment="Center" Click="OnPauseButtonClicked" 
        d:DataContext="{d:DesignInstance local:MainWindow}"> 
       <Rectangle Width="20" 
          Height="20"> 
        <Rectangle.Fill> 
         <VisualBrush Stretch="Fill" 
            Visual="{StaticResource appbar_control_pause}" /> 
        </Rectangle.Fill> 
       </Rectangle> 
      </Button> 
     </Grid> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

C#コード:

private Visibility _playButtonVisiblity; 
    private Visibility _pauseButtonVisiblity = Visibility.Hidden; 

    public Visibility PlayButtonVisibility 
    { 
     get 
     { 
      return _playButtonVisiblity; 
     } 
     set { _playButtonVisiblity = value; 
      NotifyPropertyChanged("playButton"); 
     } 
    } 

    public Visibility PauseButtonVisibility 
    { 
     get 
     { 
      return _pauseButtonVisiblity; 
     } 
     set 
     { 
      _pauseButtonVisiblity = value; 
      NotifyPropertyChanged("pauseButton"); 
     } 
    } 

が、何らかの理由または別のために、私はコードを使用して可視性を変更しようと毎回、それは、影響を与えないアイデアを取りません。なぜこれが今までのすべてのことが正しいと考えているのかについて。

+2

あなたが既に持っている回答に加えて、ちょうどいいことを指摘したいと思います。あなたはスタイルトグルボタンで探している行動を得るかもしれません。 – Spongebrot

答えて

2

に正しいプロパティ名を使用する必要があります。

public Visibility PauseButtonVisibility 
{ 
    get 
    { 
     return _pauseButtonVisiblity; 
    } 
    set 
    { 
     _pauseButtonVisiblity = value; 
     NotifyPropertyChanged("PauseButtonVisibility"); // <---- This is what you want. 
    } 
} 
+0

これは正しいです。 このVM基本クラスを使用すると、通知するプロパティ内でPropertyChangedを呼び出す限り、名前を渡す必要はありません。これらの愚かなタイプミスに対処する必要はありません。 https://pastebin.com/aLMXRN50 – Joagwa

+0

ビューモデルに* Visibility *タイプを使用しないこともお勧めします。私の視点から見ると、要素が利用可能かどうかを定義するブール値プロパティを持つ方が良いですし、ビューレイヤでは* BooleanToVisibilityConverter *も使用する必要があります。 – rraszewski

+0

@Joagwaはい、Notify実装でCallerMemberName属性を使用している場合、彼は何も渡す必要はありません。しかし、彼がそれを間違って呼ぶなら、それはうまくいかないでしょう。または、おそらく私はあなたに納得できません:d – sTrenat

0

あなたは通知イベントあなたはyou'rが間違っ通知呼び出し

NotifyPropertyChanged("PlayButtonVisiblity");

+0

まだ何もありませんか? :/ –

+0

あなたはp/Pの権利を得ましたか? 'nameof()'をよく使う –

+0

はい、p/Pが正しい。 –

0

あなたのViewModelにプロパティにボタンのVisibilityプロパティをバインドしているが、セッターでは、あなたはプライベートフィールドの値が変更されたことをビューに通知されます。

そのビューがアクセスできるだけだからあなたは、プロパティの変更を通知する必要があります:この列挙型が厳密に関連した図であるので

NotifyPropertyChanged("PauseButton"); 

ものViewModelでの可視性の列挙型への結合は、ベストプラクティスではありません。単にboolプロパティにバインドしてconverterクラスを使用して、Visibility enumからboolean値に値を変換することをお勧めします。

+0

これは既に認識されており、問題は修正されました。お返事いただきありがとうございます。 –