Тип силы при автозаполнении IntelliSense в привязке XAML - PullRequest
3 голосов
/ 16 мая 2019

Я работаю над довольно крупным проектом WPF с кучей классов и файлов дизайна XAML.

Но одна вещь сводит меня с ума: автозаполнение IntelliSense Binding иногда не отображает правильные значения (в основном наситуации, когда я не могу предоставить DataType и ничего не используется, например, тип контента Page)

Таким образом, актуальный вопрос: Существует ли какой-либо способ принудительно использовать IntelliSense для использованияопределенный тип для автозаполнения?

в качестве случайного примера, возьмите это XAML :

<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              DataType="{x:Type Accounting}">
    <ListView ItemsSource="{Binding Payments}">
        <ListView.View>
            <GridView>
                <!--
                    Auto completion still assumes the type is Accounting
                    and displays the properties of Accounting instead of
                    the required Payments.
                -->
                <GridViewColumn DisplayMemberBinding="{Binding Bank}"/>
            </GridView>
        </ListView.View>
    </ListView>
</DataTemplate>

И это для C # Classes :

public class Accounting
{
    public List<Payment> Payments { get; set; }
}

public class Payment
{
    public string Bank { get; set; }
}

1 Ответ

2 голосов
/ 16 мая 2019

Вы можете использовать форму {Binding Path=(xmlNameSpace:TypeName.PropertyName)} для принудительного ввода типа и завершения в PropertyName.

Это заставляет Binding трактовать путь как присоединенное свойство , которое возвращается к «обычному» свойству, когда тип присоединенного свойства совпадает с типом привязки. Я не уверен, есть ли какие-либо дополнительные издержки при попытке разрешить его как присоединенное свойство или нет, но для Visual Studio достаточно начать автоматически заполнять свойства при вводе. Я считаю это немного хаком, так как это определенно не предназначено для использования этого синтаксиса,

В вашем конкретном примере это будет выглядеть примерно так (с учетом вашего пространства имен):

<GridViewColumn DisplayMemberBinding="{Binding Path=(local:Payment.Bank)}"/>

enter image description here

...