Как связать MultiBinding для свойства зависимости типа объекта - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть следующая привязка

<Display.Value>
    <MultiBinding StringFormat="{}{0} ({1})">
          <Binding Path="Nickname" />
          <Binding Path="FullName"  />
    </MultiBinding>
</Display.Value>

Согласно документации MultiBinding класса , это правильный синтаксис. Однако, когда я связываю его со свойством значения, появляется только пустая строка. Это свойство работает, когда я использую SingleBinding или просто обычную Binding.

public object Value
{
    get { return (object)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(Display), new PropertyMetadata(String.Empty));

Однако, когда я связываю свою мультисвязь с другим присоединенным свойством (на этот раз тип является строкой)

    public string Caption
    {
        get { return (string)GetValue(CaptionProperty); }
        set { SetValue(CaptionProperty, value); }
    }

    public static readonly DependencyProperty CaptionProperty =
        DependencyProperty.Register("Caption", typeof(string), typeof(Display), new PropertyMetadata(String.Empty));

Есть идеи, почему мультисвязывание не работает с Value, но работает с Caption? Это из-за типа объекта Value? Как я могу заставить MultiBinding работать с Value?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

MultiBinding знает тип целевого свойства, если оно не относится к типу string, вы должны получить эту ошибку привязки :

System.Ошибка Windows.Data: 31: невозможно установить MultiBinding, поскольку необходимо указать MultiValueConverter.MultiBinding: 'System.Windows.Data.MultiBinding'

Вы можете назначить TextBlock на Value, который имеет Text, связанный через MultiBinding, или вы можете, конечно,нанять конвертер.

0 голосов
/ 09 февраля 2012

Это работает для меня:

XAML

<Window ....
    DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Grid>
        <TextBlock>
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0} - ({1})">
                    <Binding Path="Value.Nickname"/>
                    <Binding Path="Value.FullName"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>

Code-Behind

public class Value
{
    public static readonly DependencyProperty NicknameProperty =
       DependencyProperty.Register("Nickname", typeof(string), typeof(Value), new PropertyMetadata(string.Empty));

    public string Nickname
    {
        get { return (string)GetValue(NicknameProperty); }
        set { SetValue(NicknameProperty, value); }
    }

    public static readonly DependencyProperty FullNameProperty =
       DependencyProperty.Register("FullName", typeof(string), typeof(Value), new PropertyMetadata(string.Empty));

    public string FullName
    {
        get { return (string)GetValue(FullNameProperty); }
        set { SetValue(FullNameProperty, value); }
    }

    public Value()
    {
        Nickname = "Nickname";
        FullName = "FullName";
    }
}


Поэтому после чата лучше всего использовать конвертер при работе с не-строкой. Использование StringFormat будет работать со строками.

...