0

stackPanel内にあるすべてのフィールドのDataContextの設定に問題があります。私がやりたいのは、データコンテキストをvm:ViewModelとして設定することです。しかし、それは機能しておらず、VSにDataBindingの支援を求めると、TextBox内にTextBox.DataContextが表示されます。一度だけ設定する方法はありますか、それともコントロールごとに設定する必要がありますか?

    <StackPanel DataContext="vm:ViewModel">
    <TextBox Text="{Binding FirstNumber}" HorizontalAlignment="Left" Height="23" Margin="206,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
            <TextBox.DataContext>
                <vm:ViewModel/>
            </TextBox.DataContext>
        </TextBox>
    </StackPanel>
4

1 に答える 1

1

ViewModelのインスタンスを参照するようにDataContextを取得する必要があります。

DataContext="vm:ViewModel"ViewModelのインスタンスを作成しているのではなく、文字列を設定しているだけです。

代わりにプロパティ要素構文を使用してください。

    <StackPanel>
    <StackPanel.DataContext>
        <vm:ViewModel/>
    </StackPanel.DataContext>
    <TextBox Text="{Binding FirstNumber}" HorizontalAlignment="Left" Height="23" Margin="206,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    </StackPanel>

そうすれば、必要はありません/実際、TextBox.DataContextに別のデータを作成するのはおそらく間違っています...StackPanelのDataContextを継承したいだけです。

ViewModelを作成し、そのインスタンスを参照して全体像を把握する別の方法を紹介します。つまり、リソースで作成し、バインディングでそのリソースを参照します。例を次に示します。

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:WpfApplication8"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <vm:ViewModel x:Key="myviewmodel"/>
    </Window.Resources>
        <StackPanel x:Name="stackp" DataContext="vm:ViewModel">
        <TextBox Text="{Binding Source={StaticResource myviewmodel}, Path=FirstNumber}" HorizontalAlignment="Left" Height="23" Margin="206,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    </StackPanel>
</Window>

ツリーの上位レベルにDataContextを設定する別の例:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:WpfApplication8"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:ViewModel/>
    </Window.DataContext>
    <StackPanel>
        <TextBox Text="{Binding FirstNumber}" HorizontalAlignment="Left" Height="23" Margin="206,45,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    </StackPanel>
</Window>
于 2012-08-28T01:56:49.393 に答える