Привязка к пользовательскому свойству в Xaml (Windows 8.1

Я пытаюсь установить пользовательское прикрепленное свойство, к которому я могу привязаться в Xaml. Он отлично работает, если я передаю ему простые строки:

Мои свойства.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);
    };
}

Мои свойства.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 этот вопрос задает нечто подобное, но для WPF, и спрашивающий не похоже, его проблема все равно не решена.


person user1002973    schedule 22.10.2014    source источник


Ответы (1)


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

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

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

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

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

person Erti-Chris Eelmaa    schedule 22.10.2014