10

次のサンプルを使用すると、R#(resharper)は行スタイルのデータコンテキストを見つけることができず、間違ったバインディングについて警告します(実行時に正常に機能します)。スタイルがItemsSourceのDataContextを取得していないようです。

ここに画像の説明を入力してください

MainWindow.xaml:

<Window x:Class="TestDatacontext.MainWindow"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:testDatacontext="clr-namespace:TestDatacontext"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DataContext="{d:DesignInstance testDatacontext:MainWindowVM}"  >

<DataGrid ItemsSource="{Binding Items}" >
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow" >
            <Setter Property="Header" Value="{Binding Name}" />
        </Style>
    </DataGrid.RowStyle>
</DataGrid>
</Window>

MainWindowVM:

using System.Collections.ObjectModel;

namespace TestDatacontext
{
    class MainWindowVM
    {
        public ObservableCollection<ItemVM> Items { get; private set; }
    }
}

ItemVM:

namespace TestDatacontext
{
    class ItemVM
    {
        public string Name { get; set; }
    }
}
4

1 に答える 1

11

正解です。ReSharperはRowStyleこの特定のコントロールでどのように使用されるかについての知識がありません(?のすべてのアイテムごとのスタイルItemsSourceですか、それともある種のヘッダースタイルとバインディングがItemsSourceオブジェクト自体にアクセスできますか?)。宣言DataContext時に入力します。Style

Styleこの問題は、宣言に追加の注釈を付けることで解決できます。

<Style TargetType="DataGridRow" d:DataContext="{d:DesignInstance vms:ItemVM}">
  <Setter Property="Header" Value="{Binding Name}" />
</Style>

プロジェクトは正常にコンパイルされ、VSデザイナーとR#は機能しますが、VS xamlのサポートにより、エラーウィンドウで1つのエラーが発生します-「プロパティ'DataContext'はタイプ'Style'の要素にアタッチできません」。それは少し面倒ですが、機能します。もう1つの方法は、次のようにプロパティタイプをクイル化することです。

<Style TargetType="DataGridRow">
  <Setter Property="Header" Value="{Binding (vms:ItemVM.Name)}" />
</Style>

ただし、VS xamlサポートエラーも生成され、実行時の動作がわずかに異なります-このバインディングは、タイプNameのプロパティでのみ機能しItemVM、VMオブジェクトが実行時にプロパティを持つ別のタイプの他のオブジェクトに置き換えられる場合は機能しませんName(そのため、バインディングは「強く型付けされた」ものになりました)。

ReSharper 8.0でこの種の問題を解決し、VSデザイナーを幸せにするためのより良い方法をまだ探しています。混乱してすみません!

于 2012-11-21T12:22:54.563 に答える