14

ListBox我有一个 ItemContainer 的属性使用语法IsSelected绑定到我的 ViewModel 的属性。IsSelected<ListBox.ItemContainerStyle>

它工作正常,但我收到 Resharper 警告:

无法解析“FooSolution.BarViewModel”类型的数据上下文中的属性“IsSelected”。

如何在 ListBox ItemContainer 上指定 DataContext 类型以消除此警告?

这是代码。我有一BarViewModel堂课:

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

BarViewModel分配给包含 ListBox 的控件中的 DataContext

如下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}"/>

(抛出:错误 1 ​​XML 命名空间“schemas.microsoft.com/expression/blend/2008”中不存在标记“DesignInstance”;。第 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

4 回答 4

18

正如@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 的警告,并在 ViewModel 上重新命名属性时更改绑定路径。凉爽的!

于 2013-03-05T19:39:00.743 回答
8

使用标记d:DataContext="{d:DesignInstance nmspc:Clz}"的其他属性指定对我没有帮助:R# / IntelliSense 确实停止突出显示我绑定到的属性,但设计器还向我显示了错误消息而不是 viewStyle

我发现的技巧是在标签<d:Style.DataContext> 内指定。Style它似乎是如此普遍,以至于它回答了另一个问题,关于将接口用作d:DataContext.

这是我对这个问题的回答,举了一个小例子: https ://stackoverflow.com/a/46637478/5598194

于 2017-10-09T01:09:41.130 回答
3

像这样使用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"
于 2013-03-05T18:35:43.360 回答
1

除了以前的答案:摆脱错误

属性“DataContext”不可附加到“样式”类型的元素

添加一些虚拟命名空间

xmlns:ignore="designTimeAttribute"

现在使用它而不是 d:DataContext

<Style TargetType="{x:Type ListBoxItem}" ignore:DataContext="{d:DesignInstance local:FooViewModel }">
...
</Style>
于 2017-11-21T13:28:05.840 回答