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

你需要让你的 DataContext 引用你的 ViewModel 的一个实例。

DataContext="vm:ViewModel"没有创建 ViewModel 的实例......它只是设置一个字符串。

改用 Property Element 语法:

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