2014-10-22 2 views
0

Я пытаюсь установить пользовательские вложенное свойство, которое я могу связать в Xaml Он отлично работает, если я прохожу его простые строки:Связывание пользовательского свойства в Xaml (Windows 8.1

MyProperties.h:

#pragma once 

#include "pch.h" 

namespace SimpleApp 
{ 
    namespace WUX = Windows::UI::Xaml; 

    public ref class MyProperties sealed : public WUX::DependencyObject 
    { 
    private: 
     static WUX::DependencyProperty^ _MyValue; 

    public: 
     MyProperties::MyProperties(); 

     static property WUX::DependencyProperty^ MyValue 
     { 
      WUX::DependencyProperty^ get() 
      { 
       return _MyValue; 
      } 
     }; 
     static Platform::String^ GetMyValue(WUX::UIElement^ element); 
     static void SetMyValue(WUX::UIElement^ element, Platform::String^ value); 
    }; 
} 

MyProperties.cpp:

#include "pch.h" 
#include "MyProperties.h" 

using namespace Windows::UI::Xaml; 
using namespace SimpleApp; 

MyProperties::MyProperties() 
{ 
}; 


DependencyProperty^ MyProperties::_MyValue = DependencyProperty::RegisterAttached(
    "MyValue", 
    Platform::String::typeid, 
    MyProperties::typeid, 
    ref new PropertyMetadata(false) 
    ); 

Platform::String^ MyProperties::GetMyValue(UIElement^ element) 
{ 
    auto val = safe_cast<Platform::String^>(element->GetValue(_MyValue)); 
    return val; 
} 

void MyProperties::SetMyValue(UIElement^ element, Platform::String^ stringValue) 
{ 
    element->SetValue(_MyValue, stringValue); 
    OutputDebugString(L"It worked!"); 
    // Also do other stuff 
} 

Xaml:

<Page 
    x:Class="SimpleApp.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:SimpleApp" 
    Width="525" 
    > 

    <Grid x:Name="_grid" Width="500" DataContext="{Binding ElementName=_grid}"> 

     <TextBlock local:MyProperties.MyValue="Hello" Text="{Binding Width}" /> 

    </Grid> 
</Page> 

Это работает - функция SetMyValue выполняется с переданным ей параметром «Hello».

Когда я пытаюсь использовать привязку в свойстве MyValue, хотя SetMyValue не выполняется. Я заменить TextBlock с этим в Xaml:

<TextBlock local:MyProperties.MyValue="{Binding Width}" Text="{Binding Width}" /> 

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

NB this question спрашивает что-то подобное, но для WPF, и, как ни странно, его проблема не решена.

ответ

0

Я думаю, что ваша привязка работает. То, что SetMyValue не называется, также имеет смысл для меня. WPF обходит ваш getter/setter вашего имущества и вместо этого использует свойство внутренней зависимости, по причинам производительности (например, SetMyValue не вызывается).

Если вы заинтересованы об изменениях стоимости, вам нужно Явно сказать так:

(случайное копирование/вставка)

public static readonly DependencyProperty FilterIDProperty = 
      DependencyProperty.RegisterAttached(
    FilterIDPropertyName, 
    typeof(int), 
    typeof(PeopleUserControl), 
    new FrameworkPropertyMetadata(0, 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FilterIDChanged)); 

FilterIDCHanged будет называться, как только изменения свойств зависимостей. Также обратите внимание, что я передал BindsTwoWayByDefault в свойство зависимости, я не помню 100%, если это необходимо, но это также может быть причиной того, что привязка не работает.

Смежные вопросы