Укажите тип 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>