Укажите значение 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>
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