2011-06-10 101 views
8

我在代码中动态设置datacontext。我希望屏幕上的按钮可以启用/禁用,具体取决于是否DataContext == null。我能做到这一点的代码时,我分配DataContext的,但它会更好,如果我可以绑定像:)wpf如何绑定到DataContext的存在?

回答

13

您应该能够使用DataTrigger上的按钮样式,以禁用按钮时DataContext为空。另一个选项是将IsEnabled属性绑定到DataContext,如果DataContext为空,则使用值转换器返回false,否则使用true

随着触发:

<Button> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}" Value="{x:Null}"> 
       <Setter Property="IsEnabled" Value="false"/> 
      </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

随着转换器:

转换器:

public class DataContextSetConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value != null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

而且使用它

<UserControl.Resources> 
    <local:DataContextSetConverter x:Key="dataContextSetConverter"/> 
</UserControl.Resources> 

... 

<Button IsEnabled="{Binding Path=DataContext, RelativeSource={RelativeSource Self}, Converter={StaticResource dataContextSetConverter}}"/> 
+0

这样的转换器可能看起来如何? – katit 2011-06-10 23:58:58

4

这应做到:

<Button Content="ButtonName"> 
     <Button.Style> 
      <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext}" Value="{x:Null}"> 
         <Setter Property="Visibility" Value="Collapsed" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 
相关问题