重置代码中的绑定

时间:2016-11-17 09:03:23

标签: c# wpf binding

我正在编写一个能够使用this切换语言的应用程序。 我还有一个有两个功能的combox:

    如果在组合框中未选择任何项目,则
  • 提供帮助文本(请参阅this
  • 可以使用复选框选择项目(请参阅this

我的组合框看起来像

<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;临时停用了转换器,但没有效果。

每当我检查一些复选框时,都会设置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);
    }
}

取消选中所有复选框后,组合框中没有文字。 我错过了什么?

修改:在代码中添加了TextBox元素

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的代码以恢复本地化绑定,则无需重新定义Binding - 将LocExtension与适当的参数一起使用就足够了,因为它来自{ {1}}:

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); } ,路径应该是&#34; [Var1]&#34;用TranslationSource.Instance参数表示其索引器。

旁注

由于"Var1"索引器是只读的,因此将TranslationSource.Item[string]设置为reduntant。另外,出于同样的原因,我将Binding.UpdateSourceTrigger设置为Binding.Mode