Я определил пользовательский загрузочный счетчик UserControl в библиотеке WPF UserContol.У него есть одно свойство зависимости:
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>
оно будет отображаться правильно ...
Это заставляет меня поверить, что свойство зависимости неверно, но как?
E1:
После попытки выполнить те же действия на другом элементе управления, он снова перестал работать.
На этот раз у меня 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, но я думаю, что могу решить ее самостоятельно)
E2
Ok Pro проблема была в RelativePath
, указывающей на UserControl
, но она была помещена в Window