实现自定义绑定

时间:2010-12-01 00:09:52

标签: .net wpf binding

我的MyUserControl包含标签label和BO public Person Person {get;set;}

我希望Person的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 个答案:

答案 0 :(得分:3)

怎么样:

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

这不使用Label,但它实现了目标。


如果需要是Label,您可以这样做:

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

这两种方法的一个警告是,如果绑定不正确,文本也将显示Name: (none)(Person == null与没有找到属性Person的行为相同)。

答案 1 :(得分:1)

可以通过编写值转换器来解决此问题。

[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}}" 
    />

答案 2 :(得分:0)

使用Binding FallBackValue属性

        <Lable Content ="{Binding Person.Name, FallbackValue='(none)'}"/>