WPF Binding возвращает неверный объект - PullRequest
1 голос
/ 18 января 2011

У меня есть ListBox в WPF, где я устанавливаю свойство ItemsSource в коде в список «Список»

Когда я сейчас запускаю Программу, я получаю Список с моим именем класса с таким же количеством записей, что и Список.содержит.Это правильно.

Теперь я защищаю следующую Datatemplate:

<DataTemplate>
     <NetworkEditor:NetworkEditor DisplayNetwork="{Binding}"></NetworkEditor:NetworkEditor>
</DataTemplate>

Но для DependencyPropery «DisplayNetwork» всегда передается «null» (я проверял это с помощью DebugValueConverter).

Любые идеи?

Xaml из списка:

<ListBox Name="myLst" Grid.Row="3" HorizontalAlignment="Stretch"  HorizontalContentAlignment="Stretch" >
       <ListBox.ItemTemplate>               
            <DataTemplate>
                <NetworkEditor:NetworkEditor DisplayNetwork="{Binding}"></NetworkEditor:NetworkEditor>
            </DataTemplate>          
        </ListBox.ItemTemplate> 
    </ListBox>

Реализация свойства в моем UserControl:

public Network DisplayNetwork
    {
        get { return (Network)GetValue(DisplayNetworkProperty); }
        set { SetValue(DisplayNetworkProperty, value); }
    }

    // Using a DependencyProperty as the backing store for DisplayNetwork.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DisplayNetworkProperty =
        DependencyProperty.Register("DisplayNetwork", typeof(Network), typeof(NetworkEditor), new FrameworkPropertyMetadata(null, OnDisplayNetworkChanged, CoerceValueCallback));

    private static Object CoerceValueCallback(DependencyObject d,Object baseValue)
    {
        return baseValue;
    }

OnDisplayNetworkChanged никогда не вызывается, потому чтоЗначение null всегда устанавливается в качестве значения!

Источник данных моего ListBox:

myLst.ItemsSource = ((S7FunctionBlock) myBlock).Networks;

, где Networks - это список, а когда я отлаживаю эту строку, он содержит данные!

Ответы [ 2 ]

2 голосов
/ 18 января 2011

Вы проверили свой класс NetworkEditor:NetworkEditor, если вы указали в нем DataContext. Часто совершается ошибка, когда вы устанавливаете DataContext из класса, а затем пытаетесь получить доступ к DataContext из Xaml для этого тега, думая, что Родители DataContext будут возвращены.

Для проверки попробуйте изменить свой XAML на следующий.

<DataTemplate>      
    <Grid>
        <NetworkEditor:NetworkEditor DisplayNetwork="{Path=DataContext,RelativeSource={RelativeSource,Mode=FindAncestor,AncestorType=Grid}}">
        </NetworkEditor:NetworkEditor> 
    </Grid>
</DataTemplate> 

Оставьте комментарий, если есть ошибка, я не проверял ее. Однако, как говорит и Уилл Дин, в этом случае было бы неплохо изменить NetworkEditor, если он находится под вашим контролем.

1 голос
/ 18 января 2011

Как говорит HCL, DataContext этого элемента управления, вероятно, не тот, который вы думаете.

Чтобы диагностировать это, вы можете изменить {Binding} на {Binding SomethingThatDoesntExist}, а затем включить предупреждения привязки в VS. В предупреждающем сообщении о привязке будет указано, какой тип объекта был проверен на наличие «SomethingThatDoesntExist» - вы, вероятно, обнаружите, что это не то, что вы ожидали.

Если оказывается, что NetworkEditor устанавливает свой DataContext на что-то отличное от того, что вы думаете, то хорошее решение этой проблемы (при условии, что NetworkEditor находится под вашим контролем), это изменить настройку DataContext для первого объекта внутри NetworkEditor (часто это Grid в типичном UserControl), а не в самом объекте NetworkEditor.

...