2010-11-18 68 views
2

我在我的ViewModel中有一个名为IsConnected的布尔属性,我想将它绑定到我的MainWindow中的TextBlock。而不是让文本块读取truefalse我需要它说ConnectedDisconnected。原谅我,因为我是WPF的新手。如果有人能给我一个开始,我可以从那里拿走它,但我不知道如何弄清楚我需要什么。WPF数据绑定和格式化

回答

2

我一般宁愿只是一个属性添加到视图模型(我真的不喜欢的值转换器),但这里有一个简单的方法来完成你想使用样式做什么:

<TextBlock> 
    <TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Text" Value="Connected"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsConnected}" Value="False"> 
      <Setter Property="Text" Value="Disconnected"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
</TextBlock> 

编辑

需要注意的是,一旦你习惯使用数据触发器,可以做出各种修改您的观点不接触你的视图模型。例如:

<StackPanel> 
    <Image Source="images\connected.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsConnected}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
    </Image> 
    <Image Source="images\disconnected.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsConnected}" Value="False"> 
       <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
    </Image> 
</StackPanel> 
+0

这似乎是解决问题的更好方法。我并不真的认为转换器是一个好主意。样式看起来更合适,我不需要生成一个帮助属性来生成字符串值。我宁愿将我的ViewModel数据保存为它想要的数据。 – jlafay 2010-11-19 14:07:26

+0

工作很好,并感谢图像示例,因为我想在我的视图中为另一个属性做类似的事情。 – jlafay 2010-11-19 14:24:57

4

最简单的方法可能是创建一个自定义转换器,将您的bool值转换为字符串。在IValueConverter和/或WPF的任何位置搜索。

public class BoolToConnectedConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if((bool)value) 
      return "Connected"; 
     else 
      return "Disconnected"; 
    } 

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

    #endregion 
} 

添加的xmlns:

xmlns:converter="clr-namespace:MyProjectNameSpace" 

附加资源XAML(可改变任何需要的元素)在XAML

<Window.Resources> 
    <converter:BoolToConnectedConverter x:Key="connectedConverter" /> 
</Window.Resources> 

<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" /> 
+0

请添加更多细节。 – ocodo 2010-11-18 22:24:13

+1

我要做的唯一变化就是从字符串资源文件中检索文本。这样你就可以使它成为一个很好的通用'BoolToString'转换器,并使用转换器参数传递资源键的前缀以使用(前缀+ bool值==完整的密钥,以便从资源中检索字符串)。 – slugster 2010-11-18 22:34:48

+0

@slugster,我同意这一点。想了一会儿,但为了简单起见,为了这个样本而放弃了它。 – ThomasAndersson 2010-11-18 22:37:06

0

你可以在做到这一点两种方式

1)写一个转换器

2)改变功能的视图模型,使其返回所需的字符串,而不是一个布尔

最简单的方法是#2,但如果你真的需要的布尔值在代码中的其他地方,您可以使用#1(谷歌转换器和wpf)

0

看看值转换器。

http://www.wpftutorial.net/ValueConverters.html

public class BoolToConnectedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     var isConnected = (bool)value; 
     return isConnected ? "Connected" : "Disconnected"; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException("Not required for read-only values"); 
    } 
} 

在您的XAML:

<Window.Resources> 
    <l:BoolToConnectedConverter x:Key="boolToConnectedConverter" /> 
</Window.Resources> 
<Grid> 
    <Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" /> 
</Grid> 
1

使用视图模型,你写两个属性包裹,并通知在不动产的变化。

因此,无论何时更改值,字符串表示都会更新并绑定到控件,而您仍然可以在代码中使用bool属性。

public string IsConnectedStr{ 
    get{ 
    return IsConnected?"Connected":"Disconnected"; 
    } 
} 

public bool IsConnected{ 
    get{ 
    return _isConnected; 
    } 
    set{ 
    _isConnected=value; 
    PropertyChanged("IsConnected"); 
    PropertyChanged("IsConnectedStr"); 
    } 
}