【问题标题】:WPF TextBox DataContext not functionalWPF TextBox DataContext 不起作用
【发布时间】:2019-06-29 13:30:11
【问题描述】:

拥有一个 WPF 用户控件和一个包含 DevExpress GridControl 的 DockPanel,以及在 GridControl 之后和之外的一个 TextBox:

<UserControl x:Class="HellerOven.Setup.SetupGUI.WatlowView"
         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" 
         xmlns:resx="clr-namespace:HellerOven.Languages"
         xmlns:local="clr-namespace:HellerOven.Setup.SetupGUI"
         xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
         xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
         xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
         xmlns:dxb="http://schemas.devexpress.com/winfx/2008/xaml/bars"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<DockPanel>
    <dxg:GridControl x:Name="WatlowSensorsGrid" EnableSmartColumnsGeneration="True" DockPanel.Dock="Top" ItemsSource="{Binding}" FontSize="14" FontWeight="Medium"  Height="600" Margin="0,20,0,0">
    ...
    </dxg:GridControl>

    <TextBox Text="Alarm activation delay [seconds]" IsReadOnly="True" FontSize="14" Foreground="RoyalBlue" FontWeight="Medium" BorderThickness="0" Height="30"/>
    <TextBox Text="30" Name="alarmActivationDelay" FontSize="14" Foreground="RoyalBlue" FontWeight="Medium" BorderThickness="1" Width="100" Height="30"/>

    <Button Height="35" Width="200" Click="Add_Button_Click" HorizontalAlignment="Center" DockPanel.Dock="Bottom" Margin="0,50,0,0">
        <StackPanel Orientation="Horizontal">
            <Image Source="{dx:DXImage Image=Add_32x32.png}" Stretch="Uniform"/>
            <TextBlock Text="Add Watlow Sensor" VerticalAlignment="Center" Margin="5 0 0 0" FontSize="14"/>
        </StackPanel>
    </Button>
</DockPanel>

在 UserControl 的 C# 构造函数中,我为 GridControl 和 TextBox 指定了单独的 DataContext:

    public WatlowView()
    {
        InitializeComponent();
        WatlowSensorsGrid.DataContext = OvenCollections.Instance.SetupWizard.WatlowSensors;
        alarmActivationDelay.DataContext = OvenCollections.Instance.SetupWizard.alarmActivationDelay;
    }

在程序执行期间,GridControl 及其成员在其分配的 DataContext 中更新,但简单整数“alarmActivationDelay”未在其分配的 DataContext 中更新。我对 DataContext 有什么误解?谢谢。

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    要查看Gridcontrol的变化可以使用这个

    WatlowSensorsGrid.BeginDataUpdate();
    WatlowSensorsGrid.ItemsSource = OvenCollections.Instance.SetupWizard.WatlowSensors;
    WatlowSensorsGrid.RefreshData();
    WatlowSensorsGrid.EndDataUpdate();
    

    对于 textbox ,你可以简单地设置 alarmActivationDelay.Text 但如果你想使用 dataContext ,你必须实现 INotifyPropertyChanged 接口。你可以在这个link看到实现

    【讨论】:

    • 谢谢,但我决定使用上面 user3308241 的答案。感谢您的建议。
    【解决方案2】:

    您没有为 TextBox 的 Text 属性设置绑定,就像对 Grid 所做的那样。理想情况下,您应该设置 Window 的 DataContext,然后使用 Path= 设置每个控件在 XAML 中绑定到的属性。如果您这样做,您也不需要命名每个控件。下面是代码的样子:

        public WatlowView()
    {
        InitializeComponent();
        this.DataContext = OvenCollections.Instance.SetupWizard;
        // No longer needed
        // WatlowSensorsGrid.DataContext = OvenCollections.Instance.SetupWizard.WatlowSensors;
        // alarmActivationDelay.DataContext = OvenCollections.Instance.SetupWizard.alarmActivationDelay;
    }
    

    这里是相关的 XAML,为网格和文本框设置了绑定:

    <DockPanel>
    <dxg:GridControl x:Name="WatlowSensorsGrid" EnableSmartColumnsGeneration="True" DockPanel.Dock="Top" ItemsSource="{Binding Path=WatlowSensors}" FontSize="14" FontWeight="Medium"  Height="600" Margin="0,20,0,0">
    ...
    </dxg:GridControl>
    
    <TextBox Text="Alarm activation delay [seconds]" IsReadOnly="True" FontSize="14" Foreground="RoyalBlue" FontWeight="Medium" BorderThickness="0" Height="30"/>
    <TextBox Text="{Binding Path=alarmActivationDelay}" Name="alarmActivationDelay" FontSize="14" Foreground="RoyalBlue" FontWeight="Medium" BorderThickness="1" Width="100" Height="30"/>
    
    <Button Height="35" Width="200" Click="Add_Button_Click" HorizontalAlignment="Center" DockPanel.Dock="Bottom" Margin="0,50,0,0">
        <StackPanel Orientation="Horizontal">
            <Image Source="{dx:DXImage Image=Add_32x32.png}" Stretch="Uniform"/>
            <TextBlock Text="Add Watlow Sensor" VerticalAlignment="Center" Margin="5 0 0 0" FontSize="14"/>
        </StackPanel>
    </Button>
    

    【讨论】:

    • 成功!我感觉到我需要 TextBox Binding 子句,但不需要上面显示的构造函数 DataContext 分配。一旦我这样做了,它就起作用了!非常感谢!
    • 不客气。我很高兴这个解决方案对你有用。
    • 我认为有一种方法可以将其标记为已接受的答案,以便在其旁边显示一个绿色复选框。如果你能做到这一点,我将不胜感激。 stackoverflow.com/tour
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2016-04-10
    • 2013-10-19
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2011-01-20
    相关资源
    最近更新 更多