<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      享受代碼,享受人生

      SOA is an integration solution. SOA is message oriented first.
      The Key character of SOA is loosely coupled. SOA is enriched
      by creating composite apps.
        博客園  :: 首頁  :: 新隨筆  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理

      Weird behavior of DataContext Inheritance

      Posted on 2010-06-13 20:16  idior  閱讀(874)  評論(0)    收藏  舉報

      Actually there are several questions in this post, though all of them are about DataContext inheritance. I think you will have have fun with these questions, if anyone can explain what's going on here, it will be greatly appreciated, however it's really not that easy to answer.

      I created a CustomControl which derives from ContentControl by adding a Gutter property, so that the user of this control can specify two part of this control Content and Gutter. Here is my codes:

      public class BizField : ContentControl
         {
             static BizField()
             {
                 DefaultStyleKeyProperty.OverrideMetadata(typeof(BizField), new FrameworkPropertyMetadata(typeof(BizField)));
             }
      
             public object Gutter
             {
                 get { return (object)GetValue(GutterProperty); }
                 set { SetValue(GutterProperty, value); }
             }
      
             // Using a DependencyProperty as the backing store for Gutter.  This enables animation, styling, binding, etc...
             public static readonly DependencyProperty GutterProperty =
                 DependencyProperty.Register("Gutter",
                                 typeof(object), 
                                 typeof(BizField), 
                                 new UIPropertyMetadata(null,
                                     new PropertyChangedCallback(OnGutterChanged)));
      
      
             private static void OnGutterChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
             {
                 var me = sender as BizField;
                 me.OnGutterChanged(e);
             }
      
             private void OnGutterChanged(DependencyPropertyChangedEventArgs e)
             {
               
             }
         }
      

      The template is quite simple:

       

          <Style TargetType="{x:Type local:BizField}">
              <Setter Property="Template">
                  <Setter.Value>
                      <ControlTemplate TargetType="{x:Type local:BizField}">
                          <Border Background="{TemplateBinding Background}"
                                  BorderBrush="{TemplateBinding BorderBrush}"
                                  BorderThickness="{TemplateBinding BorderThickness}">
                              <StackPanel>
                                  <ContentPresenter/>
                                  <ContentPresenter ContentSource="Gutter"/>
                              </StackPanel>
                          </Border>
                      </ControlTemplate>
                  </Setter.Value>
              </Setter>
          </Style>
      

       

      Now if I use it in the main window, it works as expected:

       

      <Window x:Class="DataContexPropagate.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:DataContexPropagate"
              Title="MainWindow" Height="350" Width="525">
          <Grid>
              <local:BizField>
                  <Button Content="Click one"/>
                  <local:BizField.Gutter>
                      <Button Content="{Binding}"/>
                  </local:BizField.Gutter>
              </local:BizField>
          </Grid>
      </Window>
      
      
      public partial class MainWindow : Window
        {
            public MainWindow()
            {
                //Notice DataContext is set before parsing the baml
                this.DataContext = "Hello";       
                InitializeComponent();
               
            }
        }
      

       

      The button defined in the Gutter shows  "Hello". Now I try to add the gutter as BizField's logical child.

          private void OnGutterChanged(DependencyPropertyChangedEventArgs e)
         {
            this.AddLogicalChild(Gutter);
         }
      

      It still works fine, but if I set the DataContext after loading xaml, it will broke.

      public partial class MainWindow : Window
      {
          public MainWindow()
          {             
              InitializeComponent();
              //Set datacontext after parsing baml
              this.DataContext = "Hello";
             
          }
      }
      

      If you run the application, the button show nothing, apparently DataContext Inheritance doesn’t work properly now. But if i change the button to a TextBlock, it will work. What’s the magic with TextBlock?

       

      <Window x:Class="DataContexPropagate.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:DataContexPropagate"
              Title="MainWindow" Height="350" Width="525">
          <Grid>
              <local:BizField>
                  <Button Content="Click one"/>
                  <local:BizField.Gutter>
                      <TextBlock Text="{Binding}"/>
                  </local:BizField.Gutter>
              </local:BizField>
          </Grid>
      </Window>
      
      

      To make the databinding works for the button, i have to add following codes to BizControl.

       

      protected override System.Collections.IEnumerator LogicalChildren
           {
               get
               {
                   yield return Content;
                   yield return Gutter;
               }
           }
      

      According to this example, you will find that "setting datacontext before or after parsing Baml does matter".  But i don't why and more intersting what happened to the TextBlock?

       

       

      Full source codes for BizField:

       

      public class BizField : ContentControl
         {
             static BizField()
             {
                 DefaultStyleKeyProperty.OverrideMetadata(typeof(BizField), new FrameworkPropertyMetadata(typeof(BizField)));
             }
      
      
      
             public object Gutter
             {
                 get { return (object)GetValue(GutterProperty); }
                 set { SetValue(GutterProperty, value); }
             }
      
             // Using a DependencyProperty as the backing store for Gutter.  This enables animation, styling, binding, etc...
             public static readonly DependencyProperty GutterProperty =
                 DependencyProperty.Register("Gutter",
                                 typeof(object),
                                 typeof(BizField),
                                 new UIPropertyMetadata(null,
                                     new PropertyChangedCallback(OnGutterChanged)));
      
      
             private static void OnGutterChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
             {
                 var me = sender as BizField;
                 me.OnGutterChanged(e);
             }
      
             private void OnGutterChanged(DependencyPropertyChangedEventArgs e)
             {
                 //Comment this out, it will search for the visual parent.
                 this.AddLogicalChild(Gutter);
             }
      
             //Only by adding this method, it can work properly.
             protected override System.Collections.IEnumerator LogicalChildren
             {
                 get
                 {
                     yield return Content;
                     yield return Gutter;
                 }
             }
         }
      
       
       
      <Window x:Class="DataContexPropagate.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:DataContexPropagate"
              Title="MainWindow" Height="350" Width="525">
          <Grid>
              <local:BizField>
                  <Button Content="Click one"/>
                  <local:BizField.Gutter>
                      <Button Content="{Binding}"/>
                      <!--<TextBlock Text="{Binding}"/>-->
                  </local:BizField.Gutter>
              </local:BizField>
          </Grid>
      </Window>
      

       

      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              //Notice DataContext is set before parsing the baml
              //this.DataContext = "Hello";        
              InitializeComponent();
              //Set datacontext after parsing baml
              this.DataContext = "Hello";
             
          }
      }
      
      主站蜘蛛池模板: 亚洲中文字幕第二十三页| 国产午夜一区二区在线观看| 免费又爽又大又高潮视频| 综合激情亚洲丁香社区| 艳妇臀荡乳欲伦交换h在线观看| 亚洲精品一区国产欧美| 人成午夜免费大片| 新婚少妇无套内谢国语播放| 四虎永久在线精品8848a| 亚洲国产中文字幕精品| 宜良县| 性视频一区| 无套后入极品美女少妇| 呈贡县| 国产绿帽在线视频看| 国产精品久久久久乳精品爆| 国产一区二区一卡二卡| 亚洲天堂成人黄色在线播放| 中文字幕有码无码AV| 久久精品无码免费不卡| 人妻中文字幕av资源站| 日本成熟少妇喷浆视频| 亚洲一区精品视频在线| 国内精品综合九九久久精品| 国产精品va无码一区二区| 精品久久亚洲中文无码| 中文字幕久久波多野结衣av| 亚洲精品久久无码av片软件| 无码精品人妻一区二区三区中| 国产免费无遮挡吃奶视频| 色综合色综合色综合久久| 人人妻人人狠人人爽| 亚洲av综合久久成人网| av午夜福利一片免费看久久| 国产普通话对白刺激| 性色欲情网站iwww九文堂| 国产成年码AV片在线观看| 久青草视频在线观看免费| 国产精品一区二区久久岳| 亚洲日韩中文字幕在线播放| 2020年最新国产精品正在播放|