我在WPF UserContol库中定义了一个自定义加载微调器UserControl。 它具有一个依赖项属性:
public string SpinnerSourcePath { get => _spinner.Source.ToString(); set => _spinner.Source = (ImageSource)new ImageSourceConverter().ConvertFromString(value); }
public static readonly DependencyProperty SpinnerSourcePathProperty =
DependencyProperty.Register(nameof(SpinnerSourcePath), typeof(string), typeof(Spinner));
其中_spinner
是Image
。
(我直接在ImageSource
类中尝试过,但没有骰子)
xaml看起来像这样:
<Image x:Name="_spinner" RenderTransformOrigin="0.5 0.5">
<SomeStyleToMakeItRotate.../>
</Image>
我通过定义它来使用它,例如:
<c:Spinner SpinnerSourcePath="/Test;component/_Resources/loading.png"/>
(项目名称为Test
,Spinner
控件位于其他项目中),什么也不显示。
但是,如果我直接在Source
定义中添加Spinner
属性:
<Image x:Name="_spinner" Source="/Test;component/_Resources/loading.png" RenderTransformOrigin="0.5 0.5">
<SomeStyleToMakeItRotate.../>
</Image>
显示正确...
这使我相信依赖属性是错误的,但是怎么办呢?
尝试在其他控件上执行相同的步骤后,它再次停止工作。
这次我有DP:
public static readonly DependencyProperty ValidationFunctionProperty =
DependencyProperty.Register(nameof(ValidationFunction), typeof(Func<string, bool>), typeof(ValidatedTextBox), new PropertyMetadata(OnAssignValidation));
public Func<string, bool> ValidationFunction {
get => (Func<string, bool>)GetValue(ValidationFunctionProperty);
set => SetValue(ValidationFunctionProperty, value);
}
private static void OnAssignValidation(DependencyObject d, DependencyPropertyChangedEventArgs e) {
Debugger.Break();
}
控件用法:
<c:ValidatedTextBox x:Name="valid"
Text="Test"
ValidationFunction="{Binding Validation, RelativeSource={RelativeSource AncestorType=UserControl}, Converter={StaticResource test}}"/>
转换器只是Debugger.Break()
并返回原始
最后RelativeSource
控件是我的MainWindow
public MainWindow() {
InitializeComponent();
}
public Func<string,bool> Validation => (s) => true;
(Text
DP也存在问题,但我认为我可以自己解决该问题)
Ok Pro问题是RelativePath
指向UserControl
,但它放置在Window
答案 0 :(得分:1)
您的依赖项属性声明是错误的,因为CLR属性包装器的get
/ set
方法必须调用DependencyObject基类的GetValue
和SetValue
方法(没什么)。
除此之外,该属性还应该使用ImageSource
作为其类型:
public static readonly DependencyProperty SpinnerSourceProperty =
DependencyProperty.Register(
nameof(SpinnerSource), typeof(ImageSource), typeof(Spinner));
public ImageSource SpinnerSource
{
get { return (ImageSource)GetValue(SpinnerSourceProperty); }
set { SetValue(SpinnerSourceProperty, value); }
}
UserControl的XAML中的Image元素将使用如下属性:
<Image Source="{Binding SpinnerSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"/>