Привязка XAML, кажется, не устанавливает, если свойство инициализируется в конструкторе

Дополнительные функции, использующие find

  • Проверить наличие папки в подкаталогах:
    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
    
  • Проверить наличие одной или нескольких папок на основе шаблона в текущем каталоге:
    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
    
  • Обе комбинации. В следующем примере он проверяет наличие папки в текущем каталоге:
    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi
    
7
задан archimed7592 25 November 2009 в 04:55
поделиться

3 ответа

Я пересмотрел проблему на форумах MSDN, кто-то там предложил создать проблема в Microsft Connect ... Короче говоря: ключевой механизм, который я не совсем понял, был приоритетом значений DP . Это прекрасно описано здесь (локальное значение имеет более высокий приоритет, чем значение шаблонного родителя).

Во-вторых, не совсем очевидный момент заключается в том, что значение считается шаблонным родительским, если оно было установлено любым шаблон (даже не собственный шаблон элемента).

HTH.

4
ответ дан 7 December 2019 в 01:22
поделиться

Не инициализируйте значение в ctor, используйте CoerceValue ()

В ctor

public SomeUserControl()
{
    InitializeComponent();
    CoerceValue(SomeProperty);    
}

SomeProperty Defenition

public static readonly DependencyProperty SomeProperty =
    DependencyProperty.Register(
        "Some", typeof(ObservableCollection<IModel>),
        typeof(SomeUserControl),
        new PropertyMetadata()
        {
            DefaultValue = null,
            PropertyChangedCallback = OnSomeChanged,
            CoerceValueCallback = OnCoerceSome
        }
    );

private static object OnCoerceSome(DependencyObject d, object baseValue)
{
    var v = (ObservableCollection<IModel>)baseValue;
    return v ?? new ObservableCollection<IModel>();
}   
0
ответ дан 7 December 2019 в 01:22
поделиться

Может стоит использовать режим привязки TwoWay ? Что вы должны контролировать с "Некоторым содержанием"? Он не может сохранить его в модели вашего элемента управления, так как привязка - OneWay. в вашем случае привязка видит, что в свойстве вашей модели есть значение, и берет его, перезаписывая «Некоторое содержимое». Если не инициализировать свойство, привязка ничего не делает, потому что игнорирует нулевые значения и вы видите «Некоторое содержимое». Надеюсь, мое объяснение понятно.

РЕДАКТИРОВАТЬ

Извините за небольшое недопонимание вашей проблемы. Я загрузил ваше демонстрационное приложение и воспроизвел проблему. Читая это и это Статьи MSDN показывают, что ваши намерения были правильными. Однако вы можете найти там следующие слова:

Следующие виртуальные методы или обратные вызовы потенциально вызываются во время вычислений вызова SetValue, который устанавливает значение свойства зависимости: ValidateValueCallback, PropertyChangedCallback, CoerceValueCallback, OnPropertyChanged.

Итак, установка значения DependencyProperty в конструкторе потенциально так же опасен, как вызов виртуального метода объекта, который не создан.

Хорошо, установка DependencyProperty в конструкторе - это плохо. Моя следующая идея заключалась в том, чтобы установить значение в некотором обратном вызове (я использовал OnInitialized, поскольку он должен вызываться сразу после конструктора Control). И я обнаружил еще одно действительно странное поведение. Если я не устанавливаю никакого значения в конструкторе (таким образом)

    public CustomControl1()
    {
        //Content = "Initial1";
    }
    protected override void OnInitialized(EventArgs e)
    {
        Content = "Initial2";
        var check = Content; // after this  check == "Initial_2"
    }

, я не вижу "Initial2" в окне, даже если я не укажу никакого значения для Content в Window1.xaml. Обратите внимание, что значение установлено правильно (как я вижу, проверьте это). Но если я раскомментирую строку Content = "Initial1"; , я увижу "Initial2". Также, если я инициализирую Content в OnInitialized, привязка работает нормально, но не определяет, что фактическое значение Content равно «Initial2». Похоже, его источник не , что свойство Content.

Я продолжу работу над этой проблемой позже. Надеюсь, эта информация может быть полезной.

1
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: