2015-02-02 3 views
1
кода

XAML:Невозможно обновить переплетены управления в Silverlight просмотра

   <TextBlock Text="Country" Foreground="white" TextAlignment="Right" Grid.Row="2" Grid.Column="0" /> 
       <TextBox 
        x:Name="txtCountries" 
        Grid.Row="2" 
        Grid.Column="1" 
        Grid.ColumnSpan="2" 
        HorizontalAlignment="Stretch" 
        Margin="2, 2, 2, 2" 
        Text="{Binding PhysicalDeliveryParameters.Countries, Converter={StaticResource EnumerableToTextConverter}, ConverterParameter='...'}" 
        IsReadOnly="True"> 
       </TextBox> 
       <Button 
        Grid.Row="2" 
        Grid.Column="3" 
        Content="..." 
        HorizontalAlignment="Left" 
        Tag="Countries" 
        Click="ButtonBase_OnClick" /> 

C# код:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     PhysicalDeliveryParametersViewModel pvm = GetViewModel(); 
     GenericObservableCollection<SelectableItem> items = pvm.Countries; 

     PhysicalDeliveryParametersDlg dlg = new PhysicalDeliveryParametersDlg(items); 
     dlg.Closed += (o, args) => 
      { 
       BindingExpression binding = txtCountries.GetBindingExpression(TextBox.TextProperty); 
       if(null != binding) 
        binding.UpdateSource(); 
      }; 

     dlg.ShowDialog(); 
    } 

При нажатии на кнопку, метод ButtonBase_OnClick() выполняет: появляется диалоговое окно (PhysicalDeliveryParametersDlg класс), и я выбираю некоторые значения. Связанные данные (PhysicalDeliveryParameters.Countries, который является ObservableCollection) обновляются, но не свойство Text моего TextBox ... Я сделал что-то неправильно?

PS: Я не уверен, что использую лучший способ создания модального окна в Silverlight, не могли бы вы дать мне совет?

ответ

1

Похоже, проблема заключается в том, что PropertyChanged никогда не поднимается на свойство «Страны», поэтому представление не знает, что его нужно обновлять. (На самом деле, вероятно, это не помогло бы поднять «PropertyChanged» в этом случае - поскольку ссылка на объект не изменилась, я считаю, что время выполнения проигнорировало бы его.)

Я бы просто добавил еще одно свойство «СтраныString» или аналогично:

Text="{Binding PhysicalDeliveryParameters.CountriesString}" 

Update свойство всякий раз, когда это уместно:

dlg.Closed += (o, args) => 
{ 
    pvm.CountriesString = string.Join(", ", pvm.Countries); 
}; 
+0

Это решение, которое я буду использовать. Но я надеялся, что у меня будет лучший/более чистый :-( – schglurps

+0

@schglurps, что кажется плохим/нечистым об этом? Просто факт, что он обновляет строку стран вручную, вместо того, чтобы использовать привязку? – McGarnagle