2012-07-06 103 views
0

給定一個非常簡單的自定義容器控件CustomDock,它具有兩個附加屬性IsFooBar1和IsFooBar2。如何設置IsFooBar2更新IsFooBar1的值時,如何確保Visual Studio更新IsFooBar1的生成xaml值。WPF附加的依賴項屬性計算的字段更新

自定義控件:

public class CustomDock : DockPanel 
    { 
    public static readonly DependencyProperty IsFooBarProperty1 = DependencyProperty.RegisterAttached(
     "IsFooBar1", 
     typeof(Boolean), 
     typeof(CustomDock), 
     new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public static void SetIsFooBar1(UIElement element, Boolean value) 
    { 
     element.SetValue(IsFooBarProperty1, value); 
    } 

    public static Boolean GetIsFooBar1(UIElement element) 
    { 
     return (Boolean)element.GetValue(IsFooBarProperty1); 
    } 

    public static readonly DependencyProperty IsFooBarProperty2 = DependencyProperty.RegisterAttached(
     "IsFooBar2", 
     typeof(Boolean), 
     typeof(CustomDock), 
     new PropertyMetadata(false) 
    ); 

    public static void SetIsFooBar2(UIElement element, Boolean value) 
    { 
     element.SetValue(IsFooBarProperty2, value); 
     element.SetValue(IsFooBarProperty1, value); 

    } 

    public static Boolean GetIsFooBar2(UIElement element) 
    { 
     return (Boolean)element.GetValue(IsFooBarProperty2); 
    } 

} 

及其在XAML中使用:

<Window x:Class="TestAttachedIndirectProperties.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:TestAttachedIndirectProperties"> 
<Grid> 
    <my:CustomDock Height="100" HorizontalAlignment="Left" Margin="138,123,0,0" x:Name="customDock1" VerticalAlignment="Top" Width="200"> 
     <Button Content="Button" Height="23" Name="button1" Width="75" my:CustomDock.IsFooBar1="True" my:CustomDock.IsFooBar2="True" /> 
    </my:CustomDock> 
</Grid> 

在Visual Studio的設計,如果IsFooBar2更改爲false,那麼IsFooBar1也應給予一個錯誤的值,但它不是,無論是在屬性面板還是在xaml代碼中。

+0

Visual Studio不會在設計時連續執行您的代碼。它第一次加載,就是這樣。如果你有Blend,那麼你可能會看到它......但是你爲什麼想要像這樣改變設計時間的價值? – mlemay 2012-07-06 11:43:08

+0

我正在通過屬性窗格更改IsFooBar2,就像我爲任何其他屬性一樣。 IsFooBar2在內部更改IsFooBar1的值。此更改不會反映在xaml或屬性窗格中。 Visual Studio不需要連續執行代碼。 – DAC 2012-07-06 11:48:22

+0

而在運行時,xaml會更新爲良好的值?它只是在設計階段嗎? – mlemay 2012-07-06 11:51:17

回答

1

WPF不保證你的依賴屬性設置器會被調用(這很奇怪)如果你想設置依賴屬性,你需要做它我通過屬性定義註冊一個OnPropertyChanged回調,並把級聯邏輯那裏。