簡體   English   中英

WPF依賴項屬性綁定中斷,並始終使用默認值

[英]WPF Dependency property binding breaks and always uses the default value

我有如下定義的依賴項屬性。 它在Childusercontrol的xaml.cs中定義。 它始終使用RGB(255,0,0)默認值,即。 紅色

public Color ForeColor
{
    get {return (Color)this.GetValue(ForeColorProperty); }
    set {this.SetValue(ForeColorProperty, value);}
}

public static readonly DependencyProperty ForeColorProperty = DependencyProperty.Register("ForeColor", typeof(Color), typeof(Childusercontrol), new PropertyMetadata(Color.FromRgb(255,0,0), OnCurrentForeColorPropertyChanged));

private static void OnCurrentForeColorPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{    
    Childusecontrol control = source as Childusecontrol;
    Color fcolor= (Color)e.NewValue;
}

該值通過父用戶控件的xaml傳遞為

<UC:Childusercontrol ForeColor="{Binding ChildForeColor}"/>

ChildForeColor是ParentUserControl的ViewModel中Color類型的屬性,定義如下。

 private Color _ChildForeColor;
    public Color ChildForeColor 
    {
    get
    {
    return _ChildForeColor ;
    }
    set
    {
    if (_ChildForeColor  != value)
    {
    _ChildForeColor  = value;
    RaisePropertyChanged(()=> ChildForeColor );
    }
    }
    }

然后,在parentusercontrol的構造函數中,如下設置ChildForeColor屬性。

作為構造函數參數傳遞的值是blue

public Parentusercontrol(System.Drawing.Color ForeColor)
{
ChildForeColor  = Color.FromRgb(ForeColor.R, ForeColor.B, ForeColor.G);
}

但是, InitializeComponent(); 父控件的xaml.cs的值清除了依賴項屬性的值,因此,僅使用默認值。

我是否需要更改依賴項屬性的定義? 如何解決這個錯誤?

這對我來說效果很好!

  1. ChildControl

    我在Xml中給UserControl一個名稱,即

     <UserControl ... (all normal namespaces)... x:Name="Child"> <Border> <Border.Background> <SolidColorBrush Color="{Binding ForeColor, ElementName=child}"/> </Border.Background> </Border> </UserControl> 

    屬性“ ForeColor”是您自己定義的依賴項屬性。 此控件本身也可以完美運行。

  2. ParentControl

    我做的和ChildControl一樣。 即給它起個名字。

     <UserControl ... (Usual NS)... x:Name="parent"> <Border BorderThickness="2"> <local:ChildUserControl Margin="5" ForeColor="{Binding ChildForeColor, ElementName=parent}"/> <Border.BorderBrush> <SolidColorBrush Color="{Binding ChildForeColor, ElementName=parent}"/> </Border.BorderBrush> </Border> </UserControl> 

    這對於測試C#類的外觀也可以正常工作,如下所示

     public ParentUserControl(System.Drawing.Color c) { InitializeComponent(); Color c2 = Color.FromRgb(cR, cG, cB); ChildForeColor = c2; } private Color _ChildForeColor = Color.FromRgb(0, 255, 0); public Color ChildForeColor { get { return _ChildForeColor; } set { if (value != _ChildForeColor) { _ChildForeColor = value; OnPropertyChanged(() => ChildForeColor); } } } 

    我已經為_ChildForeColor分配了一個僅用於測試的值,但這不是必需的。 但是請注意,如果您運行NotifyPropertyChanged事件,則該事件不會在InitializeComponent()之前發生; 我猜這是因為還沒有初始化任何內容來監聽更改。 因此,您有2個選擇。 刪除OnPropertyChanged並在InitializeComponent之前分配顏色,或使用OnPropertyChanged,但僅在InitializeComponent之后分配顏色。 第一個解決方案仍然可以使用,因為在組件進入並尋找值之前更改了屬性值。

  3. 用於構造控件的窗口

    由於您分配了一個接受變量的構造函數,因此這有點棘手。 所以我的代碼如下所示:

     public Control ParContent { get { return (ContentControl)GetValue(ParContentProperty); } set { SetValue(ParContentProperty, value); } } //Register Dependency ParContent Property public static readonly DependencyProperty ParContentProperty = DependencyProperty.Register("ParContent", typeof(ContentControl), typeof(MainWindow), new PropertyMetadata( )); public MainWindow() { InitializeComponent(); ParContent = new ParentUserControl(System.Drawing.Color.Blue); } 

    和在Xaml中

     <Window ...Title="MainWindow" Height="478.784" Width="736.87" x:Name="win"> <Grid> <local:ChildUserControl HorizontalAlignment="Left" Height="100" Margin="122,298,0,0" VerticalAlignment="Top" Width="100"/> <ContentControl x:Name="Parent" Content="{Binding ParContent,ElementName=win}" HorizontalAlignment="Left" Margin="106,49,0,0" VerticalAlignment="Top" Height="79" Width="93"/> </Grid> </Window> 

正如我所說的,這對我來說非常好,所有屬性都保持其值。

可能的解決方案:

  1. 確保為父級的childForeColor分配了一種顏色,尤其是在使用普通屬性時。

  2. 如果您在Parent控件中使用普通屬性,請確保如果在初始化之后更改了顏色,則將調用INotifyPropertyChange(我猜您已經訂閱了)

  3. 也許改用FrameworkPropertyMetadata,然后添加標志AffectsRender-不要以為這是問題,但值得一試

  4. 嘗試使用綁定模式-盡管我也不認為這是真正的問題

  5. 如果您使用的是2個x控件,其中1個屬性最有可能從另一個屬性繼承,請使用繼承屬性-http: //msdn.microsoft.com/zh-cn/library/ms753197(v=vs.110).aspx

底線,我懷疑父母的“ ChildForeColor”可能是造成問題的原因,因為乍一看,以上對我來說似乎還可以。

編輯

嘗試執行以下操作。 在xaml中給您的父控件一個名稱x:name =“ Parent”,然后在綁定模式下執行此操作

<UC:Childusercontrol ForeColor="{Binding ChildForeColor, ElementName="Parent"}"/>

如果問題出在綁定上,則應該解決所有綁定問題。

但是,您說“父控件的xaml.cs清除依賴項屬性的值,因此,僅使用默認值。” 這表明問題不在於綁定或子控件,據我所知...

我還假設您已逐步完成代碼,因此在點擊此代碼后

ChildForeColor  = Color.FromRgb(ForeColor.R, ForeColor.B, ForeColor.G);

ChildForeColor看起來正確,然后如果您覆蓋OnInitialized()並在base.OnInitialized(e)之后評估ChildForeColor的值; 已經運行的ForeColor還是不變的?

通過這種方式,我還假設您尚未刪除InitializeComponent(); 來自構造函數,以及InitializeComponent(); 在ChildForeColor = ....!之后 在您的構造函數中,您不會顯示InitializeComponent()在哪里,我認為它只是為了易於閱讀。

如果此時ForeColor保持不變並假定為base.OnInitialized,則它是第一個在OnInitialized中運行的方法。 然后初始化不是問題,然后替代建議是將ChildForeColor更改為適當的依賴項屬性:

public Color ChildForeColor
    {
        get { return (Color)GetValue(ChildForeColorProperty); }
        set { SetValue(ChildForeColorProperty, value); }
    }

    //Register Dependency ChildForeColor Property
    public static readonly DependencyProperty ChildForeColorProperty = DependencyProperty.Register("ChildForeColor", typeof(Color), typeof(ParentControl), new FrameworkPropertyMetadata());

看看是否會改變它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM