2017-09-06 120 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

已经意识到这一点,并且问题已解决,谢谢您的回答。 –