WPF数据绑定和格式化

时间:2010-11-18 22:19:58

标签: wpf data-binding mvvm

我的ViewModel中有一个名为IsConnected的bool属性,我想将它绑定到MainWindow中的TextBlock。我不需要将文本块设为truefalse,而是需要它来代替ConnectedDisconnected。原谅我,因为我是WPF的新手。如果有人能给我一个良好的开端,我可以从那里拿走它,但我不知道如何弄清楚我需要什么。

5 个答案:

答案 0 :(得分: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(更改为所需的任何元素)

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

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

答案 1 :(得分: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>

答案 2 :(得分:1)

使用ViewModel,编写两个属性包,并通知不动产中的更改。

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

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

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

答案 3 :(得分:0)

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

1)写一个转换器

2)更改ViewModel中的函数,使其返回所需的字符串而不是bool

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

答案 4 :(得分: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>