在样式中指定列表框 ItemContainer 上的数据上下文类型

Posted

技术标签:

【中文标题】在样式中指定列表框 ItemContainer 上的数据上下文类型【英文标题】:Specify datacontext type on listbox ItemContainer in style 【发布时间】:2013-02-20 06:52:00 【问题描述】:

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

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

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

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

这里是代码。我有一个BarViewModel 类:

public ObservableCollection<FooViewModel> FooItems  get;set; 

BarViewModel 分配给包含 ListBox 的 Control 中的 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>

更新 正如 HighCore 所建议的,我尝试使用 setter 设置 d:DataContext,但不幸的是,它无济于事,甚至破坏了构建:

<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>

【问题讨论】:

【参考方案1】:

对先前答案的补充:摆脱错误

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

添加一些虚拟命名空间

xmlns:ignore="designTimeAttribute"

现在使用它而不是 d:DataContext

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

【讨论】:

【参考方案2】:

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

我发现的技巧是在Style 标签inside 中指定&lt;d:Style.DataContext&gt;。它似乎是如此普遍,以至于它回答了另一个问题,即使用接口作为d:DataContext

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

【讨论】:

【参考方案3】:

正如@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 上重命名属性时更改绑定路径。酷!

【讨论】:

我收到以下错误:属性“DataContext”不可附加到“样式”类型的元素。 ¿?¿?¿ @somos ,你确定吗,你使用的是 blend SDK 中的 d:DataContext (这是一个特殊的附加属性,可以让设计人员在设计时了解 VM 的类型) @Isantipov 我也得到相同的属性“DataContext”不可附加到“样式”类型的元素错误。是的,我正在使用 blend SDK 中的 d:DataContext。 @Kabbalah @Ignacio 您还需要添加以下xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" @daVinci 这由 Visual Studio 自动添加,但不能解决问题。【参考方案4】:

像这样使用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"

【讨论】:

有趣的是:我不断收到 Resharper 警告,解决方案现在无法编译:引发以下错误:错误 1 ​​XML 命名空间“schemas.microsoft.com/expression/blend/2008”中不存在标签“DesignInstance”。第 31 行位置 50。我错过了什么吗? 您是否添加了mc:Ignorable="d" 是的,我做到了:没有帮助。您是否尝试过在样式中设置 d:DataContext? 我找到了解决方案:您需要在 Style 元素本身上指定 d:DataContext ,而不是在 setter 中(请参阅下面的回复)。如果没有你的想法,我不会完成这个 - 非常感谢! 我得到一个错误 1 ​​属性“DataContext”也不能附加到“Setter”类型的元素......有什么想法吗?命名空间在视图的其他元素上运行良好...¿?

以上是关于在样式中指定列表框 ItemContainer 上的数据上下文类型的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中指定默认通知样式

如何从不同的数据框中指定训练集和测试集?

如何在频道列表中指定语音频道的位置?不和谐.py

有没有办法在 app.xaml 文件的样式中指定 OnPlatform ?

如何在数据框中指定缺失值

如何在面板控件中指定图片框的位置而不是使用foreach?