C# 高级多重绑定

C# 高级多重绑定,c#,wpf,binding,C#,Wpf,Binding,我有这样的想法: <Controls:ToggleRectangleButton.Visibility> <MultiBinding Converter="{StaticResource MultiButtonCheckedToVisibilityConverter}"> <Binding ElementName="btDayAndNightsLinesTickets" Path="IsButtonChecked" /> <

我有这样的想法:

<Controls:ToggleRectangleButton.Visibility>
   <MultiBinding Converter="{StaticResource MultiButtonCheckedToVisibilityConverter}">
      <Binding ElementName="btDayAndNightsLinesTickets" Path="IsButtonChecked" />
      <Binding ElementName="btSchoolSemester" Path="IsButtonChecked" />
   </MultiBinding>
</Controls:ToggleRectangleButton.Visibility>
这意味着,如果作为参数传递的按钮中至少有一个IsButtonChed属性设置为true->show control。否则就把它藏起来

我想添加一些功能,即条件:

如果(otherButton.IsChecked)返回System.Windows.Visibility.Hidden


所以,如果选中otherButton,则隐藏控件(独立于其他条件)。我希望能够设置多于1个的“otherButtons”(如果至少选中了一个“otherButtons”选项->隐藏)。

绑定顺序将保留在转换器代码中。 您可以使用索引检查
对象[]值
,并根据它实现您的逻辑

例如:

if((values[0] is bool) && ((bool)values[0]))
{
    //DoSomething
}
试试这个:

public class MultiButtonCheckedToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool visible = false;
        int trueCount = (int)parameter;

        for (int i = 0; i < trueCount; i++)
        {
            if ((bool)values[i]) 
            {
                visible = true;
                break;
            }
        }

        if (visible)
        {
            for (int i = trueCount; i < values.Length; i++)
            {
                if (!(bool)values[i])
                {
                    visible = false;
                    break;
                }
            }
        }

        if (visible)
        {
            return System.Windows.Visibility.Visible;
        }
        else
        {
            return System.Windows.Visibility.Hidden;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类MultiButtonCheckedToviabilityConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,System.Globalization.CultureInfo区域性)
{
bool可见=错误;
int trueCount=(int)参数;
对于(int i=0;i
XAML:


2.
B白天和晚上的床单
学期
B其他1
B其他2

这个想法是告诉转换器有多少按钮显示控件。如果此计数不是常量,则可以重构转换器以将计数作为第一个绑定接收。

不应将button作为绑定的值提供,因为此类绑定永远不会侦听button的属性。
public class MultiButtonCheckedToVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool visible = false;
        int trueCount = (int)parameter;

        for (int i = 0; i < trueCount; i++)
        {
            if ((bool)values[i]) 
            {
                visible = true;
                break;
            }
        }

        if (visible)
        {
            for (int i = trueCount; i < values.Length; i++)
            {
                if (!(bool)values[i])
                {
                    visible = false;
                    break;
                }
            }
        }

        if (visible)
        {
            return System.Windows.Visibility.Visible;
        }
        else
        {
            return System.Windows.Visibility.Hidden;
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
<Button Content="Test">
    <Button.Visibility>
        <MultiBinding Converter="{StaticResource MultiButtonCheckedToVisibilityConverter}">
            <MultiBinding.ConverterParameter>
                <sys:Int32>2</sys:Int32>
            </MultiBinding.ConverterParameter>
            <Binding ElementName="btDayAndNightsLinesTickets" Path="IsChecked" />
            <Binding ElementName="btSchoolSemester" Path="IsChecked" />
            <Binding ElementName="btOther1" Path="IsChecked" />
            <Binding ElementName="btOther2" Path="IsChecked" />
        </MultiBinding>
    </Button.Visibility>
</Button>
<ToggleButton Name="btDayAndNightsLinesTickets">btDayAndNightsLinesTickets</ToggleButton>
<ToggleButton Name="btSchoolSemester">btSchoolSemester</ToggleButton>
<ToggleButton Name="btOther1">btOther1</ToggleButton>
<ToggleButton Name="btOther2">btOther2</ToggleButton>