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>