2015-02-09 2 views
3

Можно ли вызвать пользовательское свойство зависимостей в XAML элемента, в котором он определен?Вызов пользовательского свойства зависимостей, заданного в коде с кодом XAML

Я имею в виду, у меня есть следующий простой код для моего MainWindow:

Код

public partial class MainWindow : Window 
{ 

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(MainWindow)); 

    public MainWindow() 
    { 

     InitializeComponent(); 

    } 

    public double SpecialTo 
    { 
     get 
     { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set 
     { 
      SetValue(DoubleAnimation.ToProperty, value); 
     } 
    } 
} 

Как я могу использовать это свойство зависимости от парциального кода XAML класса MainWindow?

Я имею в виду что-то вроде:

<Window x:Class="WpfAnimationTEst.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"   
    SpecialTo=200> 

Я знаю, что это можно сделать, используя вложенные свойства зависимостей, но это единственный способ? Невозможно ли вызвать свойство зависимостей, определенное в коде?

Спасибо и извините, если вопрос какой-то глупо, я просто изучаю и пытаюсь понять WPF.

ответ

0

Вы можете использовать пользовательские свойства зависимостей в XAML, но только если вы создаете экземпляр элемента управления в XAML. Например, возьмите настроенный TextBox элемента:

public class MyTextBox : TextBox 
{ 
    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(MyTextBox)); 

    public double SpecialTo 
    { 
     get 
     { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set 
     { 
      SetValue(DoubleAnimation.ToProperty, value); 
     } 
    } 
} 

Конечно, Вы можете создать экземпляр MyTextBox в XAML и присвоить SpecialTo свойства там:

<custom:MyTextBox SpecialTo="1.0" /> 

В вашем случае, однако, вы не создавая экземпляр класса MainWindow, но вы создаете новый экземпляр класса Window, а класс Window не знает свойства пользовательской зависимости (свойство SpecialTo еще не доступно в Window, так как вы объявили его в классе MainWindow).

Для свойства зависимостей следует признать, вы должны были бы создать экземпляр MainWindow непосредственно:

<custom: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"   
    SpecialTo=200> 

Однако это означает, что вам нужно опустить x:class директиву, которая используется для объединения XAML и CodeBehind вашего окна (в противном случае вы столкнулись бы с круговыми зависимостями), и я не уверен, правильно ли это повлияет на ваше окно ...

2

Я нашел ответ после того, как изначально был отправлен неправильный ответ:
Проблема действительно в круговых зависимостях если вы используете andre спросите. Я должен был создать BaseClass для всех окон:
1) Создание нового окна базового класса:

public class BaseWindow : Window { 
    public BaseWindow() { } 

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(BaseWindow)); 

    public double SpecialTo { 
     get { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set { 
      SetValue(SpecialToProperty, value); 
     } 
    } 
} 

Это будет новый BaseClass для всех ваших окон.
2) Измените MainWindow XAML:
(Изменить YOURNAMESPACE (2x) на ваше имя пространства имен)

<local:BaseWindow x:Class="YOURNAMESPACE.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:YOURNAMESPACE" 
     Title="MainWindow" Height="350" Width="525" SpecialTo="100"> 
    <Grid> 

    </Grid> 
</local:BaseWindow> 

3) И вы также должны изменить свой частичный MainWindow.CS:

public partial class MainWindow : BaseWindow { 
     public MainWindow() { 
      InitializeComponent(); 
     } 
    } 

Это работало для меня, однако, вы всегда должны использовать дополнительные XAML разметку в вашем объявлении окна.

+0

@Clemens Да, я об этом побеспокоил, и я подумал, что, поскольку это совершенно другой подход, я бы скорее создал новый. Пожалуйста, исправьте меня, если я ошибаюсь ... –

0

Я отвечаю на свой вопрос, потому что, кажется, есть много способов решить проблему правильно. Я поддержал ответы, которые мне очень помогли, но я не могу утверждать, что это правильный ответ, поскольку все правильно.

Так что я просто отправлю вывод. Если вы думаете, что я ошибаюсь, отправьте комментарий, и я исправлю свое мнение.

Главный ответ на мой вопрос: нет, невозможно напрямую вызвать пользовательское свойство зависимостей, определенное в коде, из его «связанного» файла XAML. Обязательно создавать экземпляр элемента управления, в котором свойство определено для его вызова.

Для меня лучшие рабочие места для использования пользовательского свойства зависимостей в XAML, определенные в коде, - это отправленные @Clemens и @Noel Widmer. This и this

+0

Возможно, стоит упомянуть, что вы всегда можете ** привязать ** к свойству Window в своем собственном XAML, поэтому нет проблем с доступом к значению свойства. Все еще не уверен, что именно вы имеете в виду при вызове пользовательского свойства зависимостей. См. Мой обновленный ответ. – Clemens