[英]Binding Dictionary Value to Dependency Property of a UserControl 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的值清除了依賴項屬性的值,因此,僅使用默認值。
我是否需要更改依賴項屬性的定義? 如何解決這個錯誤?
這對我來說效果很好!
ChildControl
我在Xml中給UserControl一個名稱,即
<UserControl ... (all normal namespaces)... x:Name="Child"> <Border> <Border.Background> <SolidColorBrush Color="{Binding ForeColor, ElementName=child}"/> </Border.Background> </Border> </UserControl>
屬性“ ForeColor”是您自己定義的依賴項屬性。 此控件本身也可以完美運行。
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之后分配顏色。 第一個解決方案仍然可以使用,因為在組件進入並尋找值之前更改了屬性值。
用於構造控件的窗口
由於您分配了一個接受變量的構造函數,因此這有點棘手。 所以我的代碼如下所示:
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>
正如我所說的,這對我來說非常好,所有屬性都保持其值。
可能的解決方案:
確保為父級的childForeColor分配了一種顏色,尤其是在使用普通屬性時。
如果您在Parent控件中使用普通屬性,請確保如果在初始化之后更改了顏色,則將調用INotifyPropertyChange(我猜您已經訂閱了)
也許改用FrameworkPropertyMetadata,然后添加標志AffectsRender-不要以為這是問題,但值得一試
嘗試使用綁定模式-盡管我也不認為這是真正的問題
如果您使用的是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.