2016-11-17 2 views
0

Я пишу приложение, которое может переключать язык, используя this. У меня также есть COMBOX с двумя особенностями:Сброс привязки в коде

  • питания Текст справки, если ни один элемент не выбран в выпадающем списке (см this)
  • элементы выбираются с флажками (см this)

Мой COMBOBOX выглядит

<Grid> 
    <ComboBox x:Name="MyCB" SelectionChanged="OnCbObjectsSelectionChanged" ...> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="{Binding IsSelected}" Checked="OnCbObjectCheckBoxChecked" Unchecked="OnCbObjectCheckBoxChecked" Width="20" /> 
        <TextBlock Text="{Binding Value}" Width="100" /> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    <TextBlock Visibility="{Binding SelectedItem, ElementName=MyCB, Converter={StaticResource Null2Vis}}" 
     IsHitTestVisible="False" 
     VerticalAlignment="Center" 
     Name="tbObjects" 
     Text="{ns:Loc Var1}" 
     FontSize="20" 
     Foreground="Gray"/> 
    </Grid> 

Я временно деактивирован преобразователь с return Visibility.Visible;, не е ffect.

Всякий раз, когда я проверяю некоторые флажки, свойство combobox.Text установлено, и привязка из ns: Loc переопределяется. Как я могу установить его снова в коде, если все флажки не отмечены?

private void OnCbObjectCheckBoxChecked(object sender, RoutedEventArgs e) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (var cbObject in MyCB.Items) 
     if (cbObject.IsSelected) 
      sb.AppendFormat("{0}, ", cbObject.Value); 
    tbObjects.Text = sb.ToString().Trim().TrimEnd(','); 

    if (tbObjects.Text == "") 
    { 
     Binding myBinding = new Binding(); 
     myBinding.Source = TranslationSource.Instance["Var1"]; // <- this does not work :/ 
     myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
     BindingOperations.SetBinding(tbObjects, TextBox.TextProperty, myBinding); 

     tbObjects.Foreground = new SolidColorBrush(Colors.Gray); 
    } 
} 

Когда все флажки сняты, текст в выпадающем списке отсутствует. Что мне не хватает?


Edit: Добавлен TextBox элемент кода

ответ

0

Если я понимаю ваш код правильно восстановить локализацию связывания вам не нужно переопределить Binding - она ​​должна быть достаточной, чтобы использовать LocExtension с правильным аргументом, потому что она происходит от Binding:

if (tbObjects.Text == "") 
{ 
    var myBinding = new LocExtension("Var1"); 
    BindingOperations.SetBinding(tbObjects, TextBox.TextProperty, myBinding); 

    tbObjects.Foreground = new SolidColorBrush(Colors.Gray); 
} 

Но если по каким-то причинам вы все еще хотите переопределить Binding, вот что он должен выглядеть следующим образом:

if (tbObjects.Text == "") 
{ 
    Binding myBinding = new Binding("[Var1]"); 
    myBinding.Source = TranslationSource.Instance; 
    myBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
    BindingOperations.SetBinding(tbObjects, TextBox.TextProperty, myBinding); 

    tbObjects.Foreground = new SolidColorBrush(Colors.Gray); 
} 

Обратите внимание, что источник для связывания является TranslationSource.Instance, и путь должен быть «[Var1]», чтобы указать его индексатор с "Var1" аргументом.

Примечание стороны

С TranslationSource.Item[string] индексатор только для чтения, установки Binding.UpdateSourceTrigger является reduntant. Кроме того, по той же причине я установил Binding.Mode в OneWay.

+0

К сожалению, ни одно из решений не работает. Текстовое поле остается пустым после снятия отметки со всех флажков. Даже если я устанавливаю текст вручную, он не изменяется при изменении языка. tbObjects.Text = TranslationSource.Instance ["Var1"]; –

+0

В этом случае было бы полезно, если бы вы включили в свой код «TextBox», - на данный момент мы можем видеть только «ComboBox». – Grx70

+0

Я добавил «TextBox» –

Смежные вопросы