Укажите тип datacontext в списке ItemContainer в стиле

В ListBox у меня есть свойство ItemContainer IsSelected, связанное с моим свойством ViewModel IsSelected с использованием синтаксиса <ListBox.ItemContainerStyle>.

Он отлично работает, но я получаю предупреждение Resharper:

Невозможно разрешить свойство "IsSelected" в контексте данных типа "FooSolution.BarViewModel".

Как я могу указать тип DataContext в ListBox ItemContainer, чтобы избавиться от этого предупреждения?

Вот код. У меня есть класс BarViewModel:

public ObservableCollection<FooViewModel> FooItems { get;set; }

BarViewModel назначается DataContext в элементе управления, который содержит ListBox

и FooViewModel следующим образом:

public bool IsSelected
{
    get
    {
        return isSelected;
    }

    set
    {
        if (isSelected == value)
        {
            return;
        }

        isSelected = value;
        RaisePropertyChanged(() => IsSelected);
    }
}

и XAML:

<ListBox ItemsSource="{Binding FooItems}" SelectionMode="Multiple">        
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Обновление Я попытался установить d:DataContext с помощью setter, как это было предложено HighCore, но, к сожалению, это не помогает и даже разбивает сборку:

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/>

(Throws: Error 1 Тег 'DesignInstance' не существует в пространстве имен XML 'schemas.microsoft.com/expression/blend/2008';. Строка 31 Позиция 50.)

Обновление 2 Окончательно, решение состоит в том, чтобы установить d:DataContext на сам элемент стиля (см. Мой ответ ниже):

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }">
        <Setter Property="IsSelected" Value="{Binding IsSelected}" />
    </Style>

Ответы

Ответ 1

Как указано @HighCore, решение заключается в том, чтобы указать атрибут d:DataContext из blend SDK, однако он работал только тогда, когда он был установлен непосредственно в элементе Style, а не в настройке свойств:

<ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}" d:DataContext="{d:DesignInstance local:FooViewModel }">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
</ListBox.ItemContainerStyle>

Это удаляет предупреждение Resharper, а также изменяет привязку Path, когда свойство renaimed в ViewModel. Круто!

Ответ 2

используйте d:DataContext следующим образом:

<Setter Property="d:DataContext" Value="{d:DesignInstance yourxmlns:yourItemViewModelClass}"/>

Вам также потребуется следующее xmlns es, добавленное в корневой элемент:

     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d"

Ответ 3

Задание d:DataContext="{d:DesignInstance nmspc:Clz}" другими атрибутами тега Style не помогло мне:: R #/IntelliSense действительно остановил выделение свойств, к которым я привязывался, но дизайнер также показал мне сообщение об ошибке представления.

Трюк, который я обнаружил, - это указать <d:Style.DataContext> внутри тег Style. И он оказался настолько универсальным, что он отвечает на другой вопрос, используя интерфейсы как d:DataContext.

Вот мой ответ на этот вопрос с небольшим примером: fooobar.com/questions/262214/...

Ответ 4

Дополнение к предыдущим ответам: избавиться от ошибки

Свойство 'DataContext' не может быть прикреплено к элементам типа 'Style'

добавить некоторое фиктивное пространство имен

xmlns:ignore="designTimeAttribute"

и использовать его вместо d: DataContext

<Style TargetType="{x:Type ListBoxItem}" ignore:DataContext="{d:DesignInstance local:FooViewModel }">
...
</Style>