簡體   English   中英

如何將復選框的文本綁定到Expander的頁眉

[英]How do I bind text of checkbox to Header of Expander

我有一個包含3個復選框的擴展器。

<Expander Header="Bind Here" Grid.Row="3" Grid.ColumnSpan="2">
     <StackPanel >
          <CheckBox>Test 1</CheckBox>
          <CheckBox>Test 2</CheckBox>
          <CheckBox>Test 3</CheckBox>
     </StackPanel>
</Expander>

我想將選中的復選框的文本附加到擴展器的標題。

可以使用綁定嗎?

感謝您的回答,但這是我所做的:

<Expander Header="{Binding SelectedTitle}" Grid.Row="3" Grid.ColumnSpan="2">
 <StackPanel >
      <CheckBox IsChecked="{Binding Path=SelectedItem.isTest1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Test 1</CheckBox>
      <CheckBox IsChecked="{Binding Path=SelectedItem.isTest2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Test 2</CheckBox>
      <CheckBox IsChecked="{Binding Path=SelectedItem.isTest3, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">Test 3</CheckBox>
 </StackPanel>

 public String SelectedTitle
    {
        get
        {
            StringBuilder builder = new StringBuilder();
                if (SelectedItem.isTest1)
                    builder.Append("Browse subfolders, ");
                if (SelectedItem.isTest2)
                    builder.Append("Enter filename at the panel, ");
                if (SelectedItem.isTest3)
                    builder.Append("Always show scan settings, ");
                if (builder.Length == 0)
                    builder.Append("None");


            return builder.ToString().Trim().TrimEnd(',');
        }
    }

private void SelectedItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        UpdateProperty("SelectedTitle");
    }

選中復選框后,您需要跟蹤是否已選中,可以通過綁定或事件處理或觸發器來執行此操作。

以下是一個簡單的例子


使用綁定(僅XAML)

如果您熱衷於將其綁定,則可以嘗試在擴展模板的控制模板上設置觸發器和設置器(我將其留給用戶來編輯並產生最小的xaml,以下內容可行,但可能並非最小)-

<Window.Resources>
    <ControlTemplate x:Key="ControlTemplate" TargetType="Expander">
        <Expander x:Name="MyExpander">
            <StackPanel Orientation="Vertical">
                <CheckBox x:Name="Box1">Test 1</CheckBox>
                <CheckBox x:Name="Box2">Test 2</CheckBox>
                <CheckBox x:Name="Box3"> Test 3</CheckBox>
            </StackPanel>
        </Expander>
        <ControlTemplate.Triggers>
            <Trigger  SourceName="Box1" Property="CheckBox.IsChecked" Value="True">
                <Setter Property="Header"
                        TargetName="MyExpander"
                        Value="{Binding Content, ElementName=Box1 }" />
            </Trigger>
            <Trigger SourceName="Box2"
                     Property="CheckBox.IsChecked"
                     Value="True">
                <Setter Property="Header" TargetName="MyExpander"
                        Value="{Binding Content, ElementName=Box2 }" />
            </Trigger>
            <Trigger SourceName="Box3"
                     Property="CheckBox.IsChecked"
                     Value="True">
                <Setter Property="Header"
                        TargetName="MyExpander"
                        Value="{Binding Content, ElementName=Box3 }" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>

<Expander Template="{StaticResource ControlTemplate}"/>

或者如果您不介意后面的代碼

背后的代碼

private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
    {
        var checkBox = ((CheckBox) sender);

        if (checkBox.IsChecked != null && checkBox.IsChecked.Value)
        {
            MyExpander.Header = checkBox.Content.ToString();
        }
    }

Xaml-

<Expander x:Name="MyExpander">
    <StackPanel>
        <CheckBox Checked="ToggleButton_OnChecked">Test 1</CheckBox>
        <CheckBox  Checked="ToggleButton_OnChecked">Test 2</CheckBox>
        <CheckBox  Checked="ToggleButton_OnChecked">Test 3</CheckBox>
    </StackPanel>
</Expander>

這是一種很酷的方法:( 綁定+轉換器)

XAML:

 <Expander Grid.Row="3" Grid.ColumnSpan="2" Name="expander" Width="500">
            <Expander.Resources>
                <local:ExpanderHeaderConverter x:Key="ExpanderHeaderConverter" />
            </Expander.Resources>
            <Expander.Header>
                <TextBlock >
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource ExpanderHeaderConverter}">
                            <Binding ElementName="c1" Mode="OneWay"/>        
                            <Binding ElementName="c1" Mode="OneWay" Path="IsChecked"/>
                            <Binding ElementName="c2" Mode="OneWay"/>         
                            <Binding ElementName="c2" Mode="OneWay" Path="IsChecked"/>
                            <Binding ElementName="c3" Mode="OneWay"/>
                            <Binding ElementName="c3" Mode="OneWay" Path="IsChecked"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </Expander.Header>
            <StackPanel>
                <CheckBox Name="c1" >Test 1</CheckBox>
                <CheckBox Name="c2">Test 2</CheckBox>
                <CheckBox Name="c3">Test 3</CheckBox>
            </StackPanel>
        </Expander>

轉換器:

public class ExpanderHeaderConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string output = string.Empty;
        for (int i = 0; i < values.Length; i+=2)
        {
            if ((values[i + 1] as bool?) == true)
                output += (values[i] as CheckBox).Content.ToString()+" ";
        }
        return output;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM