web-dev-qa-db-ja.com

IntelliSense for DataBindingが機能しない

Binding拡張子のプロパティの入力ミスが原因で発生したデータバインディングの問題をデバッグしようとした数時間後。間違いに気づいたら、IntelliSenseが利用可能であれば、そもそも間違いを犯していない可能性があることに気づきました。名前の入力ミス時にエラー/警告に慣れているVisualStudioユーザーとして。おそらく私は甘やかされていますが、IntelliSenseの欠如がエラーにつながりました。

調査を行ったところ、使用している Intellisense for DataBindingが利用可能です (Ultimate edition)であることがわかりました。ブログの2番目の例に従って、簡単なWPFアプリを作成してみました。まず、ブログの2番目の例で、コンパイラエラーの原因となったエラーがあるようです。 接頭辞Type=ViewModel:MainViewModel属性とd: コンパイラエラーを修正しましたが、View-ModelクラスのプロパティがIntellisenseメニューに表示されません。私のコードは以下にあります GitHub

MainViewModel.cs:

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace IntelliSenseForDataBinding
{
    public class MainViewModel : INotifyPropertyChanged
    {
        public MainViewModel()
        {
            Greeting = "Hello World";
            Answer = 42;
        }

        private string _Greeting;
        public string Greeting
        {
            get { return _Greeting; }
            set { _Greeting = value; OnPropertyChanged(); }
        }

        private int _Answer;
        public int Answer
        {
            get { return _Answer; }
            set { _Answer = value; OnPropertyChanged(); }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }
}

MainWindow.xaml:

<Window x:Class="IntelliSenseForDataBinding.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
        mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="450"
        d:DataContext="{d:DesignInstance Type=MainViewModel, IsDesignTimeCreatable=True}"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

    </Grid>
</Window>

MainWindows.xaml.cs:

using System.Windows;

namespace IntelliSenseForDataBinding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            DataContext = new MainViewModel();
            InitializeComponent();
        }
    }
}

これが機能していない証拠です:

enter image description here

IntelliSenseメニューに「Greeting」プロパティの項目が表示されることを期待します。なぜそこにないのかについての提案はありますか?念のため、VisualStudioの設定をデフォルトにリセットしてみました。

さらに、Binding属性でタイプミスしたプロパティ名を防止または検出するための追加の方法に関する提案はありますか?

18
Dan Stevens

Visual Studio 2013でGitHubプロジェクトを開きましたが、同じ動作がしました。バインディング用のIntelliSenseはありません。

設計データは失敗しているバインディング解決の鍵であるため、これをお勧めします。

  1. プロジェクトの名前空間をWindow要素に追加します:xmlns:local="clr-namespace:IntelliSenseForDataBinding"これは解決 VMの場所に役立ちます。
  2. d:DataContextd:Typeの代わりにlocal名前空間を使用するように変更します。基本的に、使用しようとしているタイプの場所を指定します:d:DataContext="{d:DesignInstance local:MainViewModel, IsDesignTimeCreatable=True}"
  3. クリーンアップ、ビルド、およびテスト

証明: enter image description here

39
Kcvin

遅れていることはわかっていますが、Kcvinの回答は本当に役に立ちました。また、一部のクラスではDataTypeを使用できるため、intelliSenseが魔法のように機能することもできます。

例:

<DataTemplate x:Key="ItemTemplate" DataType="entities:Item">
        <Grid Height="60">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <TextBlock
                Grid.Column="0"
                Text="&#xE12B;"
                Style="{StaticResource MediumIconStyle}"
                Margin="{StaticResource XSmallLeftMargin}"
                AutomationProperties.Name="List item icon" />
            <StackPanel
                Grid.Column="1"
                Margin="{StaticResource SmallLeftMargin}"
                VerticalAlignment="Center">
                <TextBlock Style="{StaticResource ListTitleStyle}" Text="{Binding Name}" />
                <TextBlock Style="{StaticResource ListSubTitleStyle}" Text="{Binding Description}" />
            </StackPanel>
        </Grid>
    </DataTemplate>

これが将来誰かに役立つことを願っています。

0
Luk164