博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

XAML中为对象属性赋值

Posted on 2011-05-06 22:39  linFen  阅读(1138)  评论(0编辑  收藏  举报

1. 使用标签的Attribute为对象属性赋值

image

我们可以按上面的方式用字符串来赋值,但是比如上面的Fill其实Shape.Fill类型,那为什么我么可以赋Red呢?因为WPF使用TypeConverter进行了转换.

 

2. 使用TypeConverter类将XAML的Attribute与对象的Property进行转换

image

 

1 namespace DeepXAML
2 {
3     [TypeConverter(typeof(StringToPersonConverter))]
4     public class Person
5     {
6         public string Name { get; set; }
7         public Person Child { get; set; }
8     }
9 }

 

01 namespace DeepXAML
02 {
03    public class StringToPersonConverter:TypeConverter
04     {
05        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
06        {
07            if (value is string)
08            {
09                Person p = new Person();
10                p.Name = value as string;
11                return p;
12            }
13            return base.ConvertFrom(context, culture, value);
14        }
15     }
16 }

 

01 public partial class MainWindow : Window
02 {
03     public MainWindow()
04     {
05         InitializeComponent();
06     }
07   
08     private void Button_Click(object sender, RoutedEventArgs e)
09     {
10         Person p = (Person)this.FindResource("Jack");
11         MessageBox.Show(p.Child.Name);
12     }
13 }

3. 标记扩展(Markup Extensions)

标记扩展是一种特殊的Attribute=value语法,Value是由一对花括号及其括起来的内容组成,XAML编译器会对这样的内容做出解析,生成相应的对象。

1 <Grid>
2     <StackPanel>
3     <Button x:Name="btnOk" Width="200" Height="100"  Click="Button_Click">OK</Button>
4         <TextBox Text="{Binding ElementName=btnOk, Path=Width,Mode=OneWay}"  Width="200" Margin="10"  ></TextBox>
5     </StackPanel>
6 </Grid>

 

标记扩展是可以嵌套,有一些简写,比如{Binding Value,…}与{Binding Path=Value,…}等价;前者是固定位置参数,后者制定参数名字,位置顺序可以变动;标记扩展类的类名以Extension为后缀,但XAML里可以省略这个后缀。

4. 导入程序集和引用命名空间

上面的图片已经可以演示出来。