我的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);
}
答案 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)'}"/>