2017-09-06 125 views
-3

我綁定了我的xaml代碼中的兩個按鈕的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

除了你已經得到的答案,我只想指出,你可能也會得到你正在尋找一個風格的ToggleButton的行爲 – 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

我也建議不要在您的視圖模型中使用*可見性*類型。從我的角度來看,最好是有布爾屬性來定義元素是否可用,並且在視圖層中,您還必須使用* BooleanToVisibilityConverter *。 – rraszewski

+0

@Joagwa是的,如果他在他的Notify實現中使用CallerMemberName屬性,他不需要傳遞任何信息。但是如果他說錯了,那就行不通了。或者,也許我誤解了你:d – sTrenat

0

您需要在通知事件

NotifyPropertyChanged("PlayButtonVisiblity");

+0

什麼都沒有? :/ –

+0

你有沒有得到p/p的權利?更好地使用'nameof()' –

+0

是的,p/P是正確的。 –

0

你是一個按鈕的可見性屬性綁定到一個屬性在您的視圖模型,但在二傳手,你是通知認爲,私營領域的價值發生了變化。

您必須通知有關產權的變化,因爲這正是該視圖可以訪問:

NotifyPropertyChanged("PauseButton"); 

而且綁定到視圖模型一個能見度枚舉是不是最好的做法,因爲這枚舉嚴格查看相關。我建議你簡單地綁定到一個布爾屬性,並使用轉換器類將您的值從可見性枚舉轉換爲布爾值。

+0

已經意識到這一點,並且問題已解決,謝謝您的回答。 –