触发其他控制事件时的火控事件

时间:2019-01-27 20:06:57

标签: c# wpf xaml mvvm user-controls

这是我第一次在这里写。我虽然第一个问题会更复杂,但是我厌倦了寻找答案。

我刚开始使用WPF(MVVM),就可以了:

我在一个页面中有3个用户Control,其中三个是Control的同一类。重要的是,在第一个TextBox失去焦点时,它调用一种方法来计算最后一个TextBox.Text

<UserControl x:Class="ASSEMBLY.View.UserControls.EtiquetaDinamicaUserControl"
         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:ASSEMBLY.View.UserControls"
         x:Name="userControl"
         mc:Ignorable="d" 
         Background="Orange" BorderThickness="0"  >

<DockPanel VerticalAlignment="Stretch">
    <Grid Background="green">
        <Grid.ColumnDefinitions >
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Viewbox  Grid.Column="0" VerticalAlignment="Stretch" Stretch="Fill" >
            <Label Grid.Column="0" Content="{Binding NombreEtiqueta, ElementName=userControl, Mode=TwoWay}"  HorizontalAlignment="Stretch" BorderThickness="0" Margin="0,0,5,0"
             Background="White" VerticalAlignment="Stretch"  />
        </Viewbox>
        <Viewbox  Grid.Column="1" VerticalAlignment="Stretch" Stretch="Fill" >
            <TextBox Grid.Column="1" MinWidth="30"  BorderThickness="0" Margin="0,0,5,0"
             VerticalContentAlignment="Center" HorizontalContentAlignment="Left" LostFocus="IdChanged" Loaded="IdChanged"
             Text="{Binding IdValue, ElementName=userControl, Mode=TwoWay}"
             />
        </Viewbox>
        <Viewbox  Grid.Column="2" VerticalAlignment="Stretch" Stretch="Fill" >
            <TextBox Grid.Row="0" HorizontalAlignment="Stretch" IsEnabled="True" MinWidth="100"  BorderThickness="0"
                TextAlignment="Left" VerticalAlignment="Stretch" 
               Text="{Binding Path= Descripcion, ElementName=userControl, Mode=TwoWay}">
            </TextBox>
        </Viewbox>

    </Grid>
</DockPanel>

页面中有3倍相同的控件,现在我需要在UserControl2触发LostFocus时也触发usercontrol3的LostFocus。

<controls:EtiquetaDinamicaUserControl Grid.Row="0" Grid.Column="0" Margin="5,2,0,0" IdValue="{Binding Codempresa1, Mode=TwoWay}" NombreEtiqueta="TEST1"/>
<controls:EtiquetaDinamicaUserControl x:Name="UserControl2" Grid.Row="1" Grid.Column="0" Margin="5,2,0,0" IdValue="{Binding Codempresa2, Mode=TwoWay}" NombreEtiqueta="TEST2"/>
<controls:EtiquetaDinamicaUserControl x:Name="UserControl3" Grid.Row="2" Grid.Column="0" Margin="5,2,0,2" IdValue="{Binding Codempresa3, Mode=TwoWay}" NombreEtiqueta="TEST3"/>

我到处搜索相似的东西,但是我发现了eventrigger(由于我没有更改属性而无法正常工作),交互(尝试失败)。

如果我设置TextChanged属性而不是Lostfocus是可行的,因为它绑定了所有内容,但是我不想计算用户输入的每个字符的第二个文本框。

对不起,我的英语错误,谢谢您的帮助

已编辑。为了帮助我复制用户控件和视图的MVVM部分后面的代码。

用户控制代码如下:

    public static readonly DependencyProperty nombreEtiqueta =
    DependencyProperty.Register("NombreEtiqueta", typeof(string), typeof(EtiquetaDinamicaUserControl), new
    PropertyMetadata("DEF"));

    public string NombreEtiqueta
    {
        get { return (string)GetValue(nombreEtiqueta); }
        set { SetValue(nombreEtiqueta, value); }
    }

    public static readonly DependencyProperty SetDescripcionProperty =
        DependencyProperty.Register("Descripcion", typeof(string), typeof(EtiquetaDinamicaUserControl), new
        PropertyMetadata("SIN ASIGNAR"));

    public string Descripcion
    {
        get { return (string)GetValue(SetDescripcionProperty); }
        set { SetValue(SetDescripcionProperty, value); }
    }


    public static DependencyProperty SetIdValueProperty =
        DependencyProperty.Register("IdValue", typeof(string), typeof(EtiquetaDinamicaUserControl), new
        PropertyMetadata("0"));

    public string IdValue
    {
        get { return (string)GetValue(SetIdValueProperty); }
        set { SetValue(SetIdValueProperty, value);
        }
    }




    #region Evento al perder foco IdValue

    private void IdChanged(object sender, RoutedEventArgs e)
    {
        try
        {
            int tmp_id = Convert.ToInt32(((TextBox)e.Source).Text);
            if (tmp_id != 0)
            {
                Descripcion = tmp_id.ToString();
            }

        }
        catch
        {
            Descripcion = "SOLO NUMEROS";
        }

    }
    #endregion

视图中的MVVM

class PaginaReservaViewModel:ViewModelBase
{
    Reserva reserva;
    #region Atributos Agencias
    private int codempresa1;
    private int codempresa2;
    private int codempresa3;

    #endregion

    #region Get/Set Agencias
    public int Codempresa1 { get { return codempresa1; } set { codempresa1 = value; } }
    public int Codempresa2
    {
        get { return codempresa2; }
        set
        {
            codempresa2 = value;
            if (codempresa3 == 0)
            {
                codempresa3 = codempresa2;
                OnPropertyChanged("Codempresa3");

            }
        }
    }
    public int Codempresa3 {
        get { return codempresa3; }
        set {
            codempresa3 = value; } }

1 个答案:

答案 0 :(得分:0)

您可以在UserControl的TextBox的文本绑定中使用UpdateSourceTrigger="LostFocus"吗?因此它不会在每个按键输入上触发。另外,请尝试使用MVVM来实现所有这些功能(在代码隐藏中没有钩子事件),然后您将对该操作有很多控制。

我的建议: 在ViewModel中,当更改Codempresa1时,可以实现一种修改其他值的方法。您可以包括一种计算它们的方法,然后在Codempressa1的set方法中调用该方法,也可以在PropertyChanged处理程序中包括该方法。