Укажите значение DataContext типа на ItemContainer ListBox в стиле



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



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




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




Как указать тип DataContext в списке 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 с помощью сеттера, как предлагает 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>


602   4  

4 ответов:

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

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

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

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

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

Вот мой ответ на этот вопрос с небольшим образец: https://stackoverflow.com/a/46637478/5598194

Используйте d:DataContext Вот так:

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

Вам также нужно добавить следующие xmlnses к корневому элементу:

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

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

Свойство 'DataContext' не присоединяется к элементам типа 'Style'

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

xmlns:ignore="designTimeAttribute"

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

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

Comments

    Ничего не найдено.