Как я могу связать строку, чтобы удвоить в WPF? - PullRequest
2 голосов
/ 10 мая 2009

Я хочу установить привязку. Проблема в том, что цель имеет тип string, а источник - тип double. В следующем коде VersionNumber имеет тип double. Когда я запускаю это, текстовый блок пуст, без каких-либо исключений. Как я могу установить эту привязку?

<Style TargetType="{x:Type MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MyControl}">
                <TextBlock Text="{TemplateBinding Property=VersionNumber}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>

Ответы [ 3 ]

5 голосов
/ 10 мая 2009

Вам нужен конвертер:

namespace Jahedsoft
{
    [ValueConversion(typeof(object), typeof(string))]
    public class StringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value == null ? null : value.ToString();
        }

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

Теперь вы можете использовать его так:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:j="clr-namespace:Jahedsoft">

    <j:StringConverter x:Key="StringConverter" />
</ResourceDictionary>

...

<Style TargetType="{x:Type MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type MyControl}">
                <TextBlock Text="{TemplateBinding Property=VersionNumber, Converter={StaticResource StringConverter}}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>        
</Style>
4 голосов
/ 30 августа 2011

В примерах есть небольшая разница.

Привязка типа double к свойству Text работает нормально, если вы используете Texblock непосредственно в Window или другом элементе управления, поскольку по умолчанию он возвращается к методу ToString (), НО это не работает, если вы пытаетесь использовать его в ControlTemplate.

Тогда вам нужен конвертер, как это было предложено в посте.

3 голосов
/ 10 мая 2009

Вам не нужен ValueConverter. Цели Double to String работают просто отлично. Как правило, Binding будет вызывать ToString () в качестве крайней меры.

Вот пример:

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Name="w1">
        <TextBlock Text="{Binding Path=Version, ElementName=w1}" />
</Window>
using System;
using System.Windows;
namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        public double Version { get { return 2.221; } }
    }
}

Возможно, проблема в том, что ваш источник Binding не тот, о котором вы думаете. Как правило, ошибки связывания в WPF не вызывают исключений. Они регистрируют свои неудачи как бы то ни было. См. Как отладить привязки WPF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...