Сбои WPF MultiBinding. Почему?

Поскольку значение кнопки является атрибутом, необходимо использовать .attr () метод в jQuery. Это должно сделать это


, можно также использовать attr для установки атрибутов, больше информации в документах .

, Это только работает в JQuery 1.6 +. См. ответ postpostmodern для более старых версий.

6
задан Dave Clemmer 16 August 2011 в 17:04
поделиться

2 ответа

Проблема не имеет ничего общего с MultiBinding или вашим конвертером. DependencyProperty.UnsetValue означает, что привязка не имеет значения. И действительно, если вы работаете в режиме отладки, вы можете увидеть ошибки привязки в окне Output :

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsConnected; DataItem=null; target element is 'SolidColorBrush' (HashCode=17654054); target property is 'Color' (type 'Color')
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsLoggedIn; DataItem=null; target element is 'SolidColorBrush' (HashCode=17654054); target property is 'Color' (type 'Color')

Итак, давайте немного упростим разметку и применим некоторые средства диагностики:

<GroupBox>
    <GroupBox.BorderBrush>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                <Binding Path="GroupColor" PresentationTraceSources.TraceLevel="High"/>
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </GroupBox.BorderBrush>
</GroupBox>

Применение прикрепленного свойства зависимости PresentationTraceSources.TraceLevel дает еще один результат:

System.Windows.Data Warning: 52 : Created BindingExpression (hash=17654054) for Binding (hash=44624228)
System.Windows.Data Warning: 54 :   Path: 'GroupColor'
System.Windows.Data Warning: 56 : BindingExpression (hash=17654054): Default mode resolved to OneWay
System.Windows.Data Warning: 57 : BindingExpression (hash=17654054): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 58 : BindingExpression (hash=17654054): Attach to System.Windows.Media.SolidColorBrush.Color (hash=52727599)
System.Windows.Data Warning: 60 : BindingExpression (hash=17654054): Use Framework mentor <null>
System.Windows.Data Warning: 63 : BindingExpression (hash=17654054): Resolving source 
System.Windows.Data Warning: 65 : BindingExpression (hash=17654054): Framework mentor not found
System.Windows.Data Warning: 61 : BindingExpression (hash=17654054): Resolve source deferred
System.Windows.Data Warning: 91 : BindingExpression (hash=17654054): Got InheritanceContextChanged event from SolidColorBrush (hash=52727599)
System.Windows.Data Warning: 63 : BindingExpression (hash=17654054): Resolving source 
System.Windows.Data Warning: 66 : BindingExpression (hash=17654054): Found data context element: GroupBox (hash=51393439) (OK)
System.Windows.Data Warning: 67 : BindingExpression (hash=17654054): DataContext is null
System.Windows.Data Warning: 91 : BindingExpression (hash=17654054): Got InheritanceContextChanged event from SolidColorBrush (hash=52727599)
System.Windows.Data Warning: 63 : BindingExpression (hash=17654054): Resolving source 
System.Windows.Data Warning: 65 : BindingExpression (hash=17654054): Framework mentor not found
System.Windows.Data Warning: 63 : BindingExpression (hash=17654054): Resolving source 
System.Windows.Data Warning: 65 : BindingExpression (hash=17654054): Framework mentor not found
System.Windows.Data Warning: 63 : BindingExpression (hash=17654054): Resolving source  (last chance)
System.Windows.Data Warning: 65 : BindingExpression (hash=17654054): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=GroupColor; DataItem=null; target element is 'SolidColorBrush' (HashCode=52727599); target property is 'Color' (type 'Color')

Мы видим, что привязка не находит DataContext , и привязка не выполняется. Когда я изменяю конструктор Windows так, чтобы DataContext был установлен перед инициализацией содержимого, привязка работает:

public Window1()
{
    DataContext = ...;
    InitializeComponent();
}

Что странно, поскольку для привязок в других местах это не имеет значения. Не уверен, почему это не так Я там не работаю, поэтому могу предложить только обходные пути. Например, работает создание кисти в качестве ресурса с привязками (этот ресурс также может быть локальным для GroupBox ):

<GroupBox BorderBrush="{DynamicResource resbrush}">
    <GroupBox.Resources>
        <SolidColorBrush x:Key="resbrush">
            <SolidColorBrush.Color>
                <MultiBinding Converter="{StaticResource ConnectionAndLoggedInToBorderBrush}">
                    <Binding Path="IsConnected"/>
                    <Binding Path="IsLoggedIn"/>
                </MultiBinding>
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </GroupBox.Resources>
</GroupBox>

Я бы посоветовал отказаться от MultiBinding и для предварительной обработки в DataContext , если ваш класс UIManager является своего рода MVVM ViewModel .

15
ответ дан 8 December 2019 в 14:45
поделиться

Именно по таким причинам вы можете захотеть изучить MVVM. Этот шаблон помогает вам абстрагироваться от модели и привязок, чтобы вам не приходилось так сильно полагаться на DP - вместо этого вы можете просто привязать к уведомляемому свойству в модели представления.

Есть несколько отличных статей по MVVM, поэтому я предлагаю вам начать с чтения работ Карла Шиффлетта, Джоша Смита, Марлона Греча и Саши Барбер.

0
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

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