2009-09-02 3 views
0

У меня есть класс,Как сделать настраиваемый класс привязанным в WPF?

internal class PageInformation : DependencyObject 
{ 
    public static DependencyProperty NameProperty = 
     DependencyProperty.Register("Name", typeof(string), typeof(PageInformation)); 

    public static DependencyProperty PageUriProperty = 
     DependencyProperty.Register("PageUri", typeof(string), typeof(PageInformation)); 

    public string Name 
    { 
     get; 
     set; 
    } 

    public Uri PageUri 
    { 
     get; 
    } 
} 

Как я могу связать его с каким-либо источником данных?

Моя идея состоит в том, чтобы иметь файл XML, который хранит информацию обо всех страницах приложения, имеет этот класс в <Page.Resources> и привязывает его к XML-файлу.

файл XML выглядит следующим образом:

<Elements> 
     <Element Name="Administration" DisplayName="Administration" Value="1" PageUri="Administration.xaml" > 
      <Element Name="Categories" DisplayName="Categories" Value="2" PageUri="Administration.xaml" ></Element> 
      <Element Name="Goals" DisplayName="Goals" Value="3" PageUri="Administration.xaml" ></Element> 
      <Element Name="Settings" DisplayName="Settings" Value="4" PageUri="Administration.xaml" ></Element> 
     </Element> 
</Elements> 

Я хочу, чтобы иметь XAML как это:

<Page.Resources> 
      <local:PageInformation 
       x:Key="pageInfo" 
       Name="{Binding XPath=/Elements/Element[@Name='Administration']}" 
       Source="/samples.xml" > 
      </local:PageInformation> 
    </Page.Resources> 

Когда у меня есть значение для Name собственности, я хочу написать код для заполнения другие свойства (возможно, используя контекст данных?).

Может ли кто-нибудь сказать мне, как я могу это достичь?

ответ

0

Для запуска кода, когда имя изменения свойств, указать PropertyChangedCallback при регистрации свойства зависимостей:

public static DependencyProperty NameProperty = 
    DependencyProperty.Register("Name", typeof(string), typeof(PageInformation), 
    new FrameworkPropertyMetadata(OnNameChanged)); 

private static void OnNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    // do whatever you want here 
} 

Ваш OnNameChanged обработчик может заполнить другие свойства PageInformation.

Обратите внимание, что если вы хотите другие Элементы WPF для обновления в ответ на изменение имени, вы сделали бы это, привязывая свои свойства к свойству Name PageInformation.