UpdateSourceTrigger для Datacontext в Silverlight - PullRequest
0 голосов
/ 21 февраля 2011

Привет! Я работаю над приложением MVVM Silverlight и использую свойство UpdateSourceTrigger TextBox для обновления выражения связывания во время выполнения следующим образом:

.xaml.cs:

BindingExpression beID = txtEmpID.GetBindingExpression (TextBox.TextProperty);beID.UpdateSource ();

BindingExpression beAge = txtAge.GetBindingExpression (TextBox.TextProperty);beAge.UpdateSource ();

.xaml:

<Grid x:Name="LayoutRoot"
      Background="White" 
      DataContext="{Binding Source={StaticResource keyEMPVM},    
      UpdateSourceTrigger=Explicit}">

    //<Grid.RowDefinitions>

    //<Grid.ColumnDefinitions>

    <sdk:Label Grid.Row="2"
               Grid.Column="1"
               Target="{Binding ElementName=txtEmpID}" />
    <TextBox x:Name="txtEmpID"
             Grid.Row="2"
             Grid.Column="2"
             Style="{StaticResource ContentTextBoxStyle}"
             Text="{Binding emp.ID, Mode=TwoWay, ValidatesOnExceptions=True,
                                    ValidatesOnDataErrors=True,  NotifyOnValidationError=True, UpdateSourceTrigger=Explicit}" />

    <sdk:Label Grid.Row="4"
               Grid.Column="1"
               Target="{Binding ElementName=txtAge}" />
    <TextBox x:Name="txtAge"
             Grid.Row="4"
             Grid.Column="2"
             Style="{StaticResource ContentTextBoxStyle}"
             Text="{Binding emp.Age, Mode=TwoWay, ValidatesOnExceptions=True,
                                    ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=Explicit}" />

    <Button x:Name="btnSubmit"
            Grid.Row="6"
            Grid.Column="1"
            Grid.ColumnSpan="2"
            Style="{StaticResource ContentButtonStyle}"
            Content="Submit"
            Command="{Binding Path=UpdateEmployee}"
            CommandParameter="{Binding emp.ID}" />

В этом случае я делаю привязки выражений вручную для каждого текстового поля. Есть ли способ, с помощью которого яможет сделать это привязка выражений для всех элементов управления textbox внутри сетки в одном экземпляре.

1 Ответ

0 голосов
/ 22 февраля 2011

Если вы хотите обновить каждый TextBox в сетке, вы можете использовать этот код:

    private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
    {
        var grid = (Grid)sender;
        foreach (var tb in GetChildren<TextBox>(grid))
        {
            var be = tb.GetBindingExpression(TextBox.TextProperty);
            if(be != null) be.UpdateSource();
        }
    }

    public IEnumerable<T> GetChildren<T>(DependencyObject d) where T:DependencyObject
    {
        var count = VisualTreeHelper.GetChildrenCount(d);
        for(int i = 0; i < count; i++)
        {
            var c = VisualTreeHelper.GetChild(d, i);
            if (c is T)
                yield return (T)c;

            foreach (var c1 in GetChildren<T>(c))
                yield return c1;
        }
    }

Где событие KeyDown является лишь примером. Возможно, рекурсия не лучший способ решить проблему, но это самый простой способ

...