Связывание и форматирование данных WPF - PullRequest
2 голосов
/ 19 ноября 2010

У меня есть свойство bool в моей ViewModel с именем IsConnected, и я хотел бы привязать его к TextBlock в моем MainWindow. Вместо того, чтобы текстовый блок читался true или false, мне нужно вместо него сказать Connected или Disconnected. Прости меня, потому что я новичок в WPF. Если кто-то может дать мне преимущество, я могу оттуда это сделать, но я не уверен, как выяснить, что мне нужно.

Ответы [ 5 ]

4 голосов
/ 19 ноября 2010

Самый простой способ - создать пользовательский конвертер, который преобразует ваше значение 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
}

add xmlns:

xmlns:converter="clr-namespace:MyProjectNameSpace"

добавьте ресурс в XAML (измените на любой необходимый элемент)

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

в XAML:

<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" />
2 голосов
/ 19 ноября 2010

Как правило, я бы предпочел просто добавить свойство в модель представления (мне действительно не нравятся преобразователи значений), но вот простой способ выполнить то, что вы пытаетесь сделать, используя стиль:

<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>
1 голос
/ 19 ноября 2010

Используя ViewModel, вы пишете обтекание двух свойств и уведомляете об изменениях в реальном свойстве.

Чтобы при каждом изменении значения представление строки обновлялось и связывалось с элементами управления, в то время как вы все еще можете использовать свойство bool в коде.

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

public bool IsConnected{
   get{
     return _isConnected;
   }
   set{
     _isConnected=value;
     PropertyChanged("IsConnected");
     PropertyChanged("IsConnectedStr");
   }
}
0 голосов
/ 19 ноября 2010

Посмотрите на преобразователи значений.

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>
0 голосов
/ 19 ноября 2010

Вы можете сделать это двумя способами

1) Написать конвертер

2) Измените функцию в ViewModel, чтобы она возвращала желаемую строку вместо bool

Самый простой способ - это # ​​2, но если вам действительно нужно значение bool где-то еще в вашем коде, используйте # 1 (google converter и wpf)

...