2013-06-25 31 views
0

我有三個TEXTBOX綁定到LABEL。當我在TEXTBOX中鍵入內容時,TextBox文本值被設置爲Label。 問題是我想設置可見性的標籤,當文本框爲空,反之亦然。如何使用WPF中的可見性轉換?如何設置綁定到文本框的標籤的可見性?

在.XAML文件

<TextBox Name="txtEmail1" Grid.Column="1" Grid.Row="0" Text="Email" HorizontalAlignment="Stretch" Margin="2" VerticalAlignment="Stretch"/> 
<TextBox Name="txtEmail2" Grid.Column="1" Grid.Row="0" Text="Email2" Visibility="Collapsed" Margin="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
<TextBox Name="txtEmail3" Grid.Column="1" Grid.Row="0" Text="Email3" Visibility="Collapsed" Margin="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 

<Label Name="lblContactEmail1" Content="{Binding Path=Text, ElementName=txtEmail1, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
<Label Name="lblContactEmail2" Content="{Binding Path=Text, ElementName=txtEmail2, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
<Label Name="lblContactEmail3" Content="{Binding Path=Text, ElementName=txtEmail3, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 

我曾嘗試爲: 使用下面類StringToVisibilityConverter.cs

<UserControl xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" x:Class="XtremeProcurementWPF.UserControls.usContactForm" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:cv="clr-namespace:MyWPF" 
      mc:Ignorable="d"> 
<UserControl.Resources> 
     <cv:StringToVisibilityConverter x:Key="visibilityconverter" /> 
    </UserControl.Resources> 
<Grid> 
<TextBox Name="txtEmail1" Grid.Column="1" Grid.Row="0" Text="Email" HorizontalAlignment="Stretch" Margin="2" VerticalAlignment="Stretch" /> 
    <Label Name="lblContactEmail1" Content="{Binding Path=Text, ElementName=txtEmail1, Mode=OneWay, UpdateSourceTrigger=PropertyChanged,Converter={StaticResource visibilityconverter}}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
</Grid> 
</UserControl> 

問題:它顯示的文本標籤爲 「可見」,而不是在文本框中輸入的確切文本。

幫助讚賞! 謝謝!在你的資源

public class StringToVisibilityConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var s = value as string; 

     if (string.IsNullOrWhiteSpace(s)) 
      return Visibility.Collapsed; 

     return Visibility.Visible; 
    } 

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

現在的地方您註冊轉換器:

+0

仔細看看我的例子。你是**不是**應該使用轉換器作爲'Content'屬性,但是對於'Visibility'屬性,如我的示例所示。內容應該保留原來的樣子。 –

+0

檢查我對我的回答所做的修改。 –

回答

2

創建您自己的實現IValueConverter接口

<converters:StringToVisibilityConverter x:Key="StringToVisibilityConverter" /> 

最後,您使用轉換器的元素,像這樣:

<Label Name="lblContactEmail3" 
Visibility="{Binding Path=Text, ElementName=txtEmail3, Converter={StaticResource StringToVisibilityConverter}}" ... /> 

編輯:

這裏是爲Label的完整代碼:

<Label Name="lblContactEmail1" Content="{Binding Path=Text, ElementName=txtEmail1, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Visibility="{Binding Path=Text, ElementName=txtEmail1, Converter={StaticResource visibilityconverter}}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
+0

對不起@Klaus!但是如何使用它?我是wpf的新手! –

+0

我已經更新了我的答案。 –

+0

尚未發佈!請檢查以上我已編輯! –

0

你可以使用一個DataTrigger這樣的:

<StackPanel> 
     <StackPanel.Resources> 
     <Style TargetType="{x:Type Label}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=txtEmail1, Path=Text}" Value=""> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
     </StackPanel.Resources> 

     <TextBox Name="txtEmail1" Text="Email" /> 
     <Label Name="lblContactEmail1" Background="Yellow" Content="{Binding Path=Text, ElementName=txtEmail1}" /> 
    </StackPanel> 

無需在此XAML其他類唯一的解決辦法。當然,你必須適應你的需求(例如綁定)。我省略了不必要的屬性。

相關問題