Реализация пользовательского связывания - PullRequest
3 голосов
/ 01 декабря 2010

У меня есть MyUserControl, который содержит метку label и BO public Person Person {get;set;}.

Я хочу, чтобы Name Человека всегда был привязан к label, как это:

("Name: {0}", person.Name), если person != null
и
("Name: {0}", "(none)"), если person == null

более того, если имя человека будет изменено, ярлык автоматически обновит его.

есть ли возможность для такой привязки ?

«Грязный» вариант:

private void label_LayoutUpdated(object sender, EventArgs e)
{
    label.Content = string.Format("Name: {0}", _Person == null ? 
                                                      "(none)" : _Person.Name);
}

Ответы [ 3 ]

3 голосов
/ 01 декабря 2010

Как насчет:

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Name: "/>
        <TextBlock Text="{Binding Person.Name, FallbackValue='(none)'}"/>
    </StackPanel>

Это не использует метку, но она достигает цели.


Если это должна быть метка, вы можете сделать это:

    <Label Content="{Binding Person.Name, FallbackValue='(none)'}" 
           ContentStringFormat="Name: {0}"/>

Одно предостережение с обоими подходами заключается в том, что текст также будет отображать Name: (none), если привязка неверна (Person == null соответствует поведению, не имеющему свойства Person found).

1 голос
/ 01 декабря 2010

Эту проблему можно решить, написав конвертер значений.

[ValueConversion(typeof(Person), typeof(String))]
public class PersonNameConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Person person = value as Person;
        if(person == null)
        {
            return "(none)";
        }
        else
        {
           return person.Name;
        }
    }

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

Создав его, вы можете добавить его в качестве ресурса в XAML:

<local:PersonNameConverter x:Key="PersonNameConverter"/>

Затемэто может быть включено как один из параметров привязки

<TextBlock  
    Text="{Binding Path=ThePerson, Converter={StaticResource PersonNameConverter}}" 
    />
0 голосов
/ 01 декабря 2010

Использовать свойство Binding FallBackValue

        <Lable Content ="{Binding Person.Name, FallbackValue='(none)'}"/> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...