从任何地方更新Usercontrol中的TextBox.Text

时间:2017-11-03 10:24:59

标签: c# wpf xaml user-controls

我正面临一个似乎经常发生并且有很多解决方案的问题,但是,我道歉,我不能/不能适用于我的情况。让我总结一下拓扑结构:我有一个带有网格的主窗口( MainWindow ),在底部单元格中,我放置了一个由我编写的用户控件( UC_StatusMonitor )用户控件( LBL_CONN_Message )内的文本框,我想用操作结果更新(例如“连接到设备X ”,“无法从Y读取数据) “,”缺少字段“等等)。这主要用于告知用户是对还是错。我知道我必须使用Dependancy来解决这个问题,但我的实现不起作用(肯定我错过了一些东西)。

让我展示代码:

MainWindows.xaml

<Window x:Class="LUX.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LUX"
        mc:Ignorable="d"
        Title="LUX" Name ="MainForm" Height="600" Width="800"  MinHeight="600" MinWidth="800">

    <Border Padding="10">

        <Grid Name="Main_Grid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="160"/>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="100"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="22"/>
            </Grid.RowDefinitions>

            <!-- others controls ....   -->


            <!-- Monitor   -->
            <StackPanel Name="Stack_Monitor" Grid.Row="2" Grid.Column="1">
                <Grid Name="BottomBar" Height="20">
                    <local:UC_StatusMonitor Height="100" Grid.Row="2" Grid.Column="1"/>
                </Grid>
            </StackPanel>
        </Grid>



    </Border>
</Window>

然后是Control的代码

UC_StatusMonitor.xaml

<UserControl x:Class="LUX.UC_StatusMonitor"
             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:local="clr-namespace:LUX"
             mc:Ignorable="d" 
             xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
             d:DesignHeight="20" d:DesignWidth="300">
    <Grid Name="UCR_Base" Background="White">
        <WrapPanel>
            ...
            <TextBox Name="LBL_CONN_Message" Margin = "10 0 0 0" VerticalAlignment="Center" IsReadOnly="True" BorderThickness="0" Text="{Binding MyTextProperty, ElementName=control}"/>
            ...
        </WrapPanel>
    </Grid>
</UserControl>

UC_StatusMonitor.xaml.cs

namespace LUX {
    /// <summary>
    /// Interaction logic for StatusMonitor.xaml
    /// </summary>
    public partial class UC_StatusMonitor : UserControl
    {
        Button[] MenuButtons;

        //// The dependency property which will be accessible on the UserControl
        public static readonly DependencyProperty MyTextPropertyProperty = DependencyProperty.Register("MyTextProperty", typeof(string), typeof(UC_StatusMonitor), new UIPropertyMetadata(String.Empty));

        public string MyTextProperty
        {
            get { return (string)GetValue(MyTextPropertyProperty); }
            set { SetValue(MyTextPropertyProperty, value); }

所以,我期待着,无处不在(在工作空间的所有类中,我都声明了一个状态监视器静态对象),我应该使用像

这样的指令
  

MyTextProperty =“已连接”;

然后在文本框中将此消息显示为用户控件。

显然,没有发生:(

谢谢和最好的问候

1 个答案:

答案 0 :(得分:0)

我设法让UserControl与Binding一起工作 我是这样做的:
UserControlWithBinding.xaml

<UserControl x:Class="SO_app.UserControlWithBinding"
         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:local="clr-namespace:SO_app"
         mc:Ignorable="d" 
         d:DesignHeight="20" d:DesignWidth="300">
<Grid Name="IAmGroot"> <!-- Name this grid as you want as this is what we will use for internal Binding -->
    <TextBlock Text="{Binding Status}"/><!-- Because this grid is bound to the control it self you will always use this property, unless you rename it :-) -->
</Grid>


现在是UserControlWithBinding.xaml.cs

背后的代码
/// <summary>
/// Interaction logic for UserControlWithBinding.xaml
/// </summary>
public partial class UserControlWithBinding : UserControl
{
    public UserControlWithBinding()
    {
        InitializeComponent();
        IAmGroot.DataContext = this;// this is where we set the data context for the grid so it uses the UserControl and not the inherited one. This will allow us to have the DataContext for User Control to be still inherited but the grid will look into a UserControl as an object to assign it to it's data context.
    }

    public string Status
    {
        get { return (string)GetValue(StatusProperty); }
        set { SetValue(StatusProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Status.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty StatusProperty =
        DependencyProperty.Register("Status", typeof(string), typeof(UserControlWithBinding), new PropertyMetadata(null));//note that I am using null and not string.Empty


}  


现在让我们在xaml中使用我们的控件:

<local:UserControlWithBinding Status="{Binding PropertyThatYouWantToBindThisControlsText}"/>  

这可以解决您的问题。