【问题标题】:Creating ContextBinding XAML创建 ContextBinding XAML
【发布时间】:2012-08-28 10:12:48
【问题描述】:

我在为 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>

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    您需要让您的 DataContext 引用您的 ViewModel 的实例。

    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>
    

    【讨论】:

    • 感谢 Colinsmith,所以如果我希望它可用于整个 .xaml 文件,我会在最顶层定义 dataContext 吗?每次我像这样设置 dataContext 时,我都会创建一个实例?
    • 是的,您可以在最顶层的 DAtaContext 中定义它,它将被所有较低级别的元素继承。
    • 使用资源更好吗?或者只是在需要多个视图模型时?
    • 资源只是一种不同的方式......它更明确......有时你想要,有时你不......这取决于你想做什么。是的,多个 ViewModel 可以通过将它们作为不同的键控资源来处理……或者您可以通过拥有一个由 2 个或更多 ViewModel 组成的 ViewModel 来处理这种情况……许多不同的选项。
    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2011-01-20
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多