在样式列表框ItemContainer上指定datacontext类型

时间:2013-03-05 18:15:30

标签: c# wpf silverlight xaml binding

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

它工作正常,但我得到了一个Resharper警告:

  

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

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

这是代码。我有一个BarViewModel课程:

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

BarViewModel被分配给Control中的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>

更新 我已经尝试使用setC来设置d:DataContext,正如HighCore所建议的那样,但不幸的是,它没有帮助,甚至打破了构建:

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

(抛出:错误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 个答案:

答案 0 :(得分:16)

正如@HighCore指出的那样,解决方法是从blend SDK中指定d:DataContext属性,但是,只有在自己设置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上重新发现属性时更改绑定路径。酷!

答案 1 :(得分:5)

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

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

以下是一个小例子,我对这个问题的答案如下: https://stackoverflow.com/a/46637478/5598194

答案 2 :(得分:2)

像这样使用d:DataContext

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

您还需要在根元素中添加以下xmlns

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

答案 3 :(得分:1)

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

  

属性&#39; DataContext&#39;不能附加到&#39; Style&#39;

类型的元素

添加一些虚拟命名空间

xmlns:ignore="designTimeAttribute"

现在使用它代替d:DataContext

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