将ComboBox的可见性绑定到多个属性

时间:2014-03-18 08:37:57

标签: c# wpf xaml combobox

假设我有一个名为MainWindow.xaml的窗口和一个名为Page.xaml的页面。

在MainWindow.xaml上:

我有MenuFrame。在此Frame Page.xaml中显示。

DataContext的{​​p> MainWindow.xaml绑定到MainWindowViewModel

我在SelectedMenuItem上有一个名为int MainWindowViewModel的属性。

因此,菜单的SelectedItem绑定到SelectedMenuItem

在Page.xaml:

我有2 ComboBoxes名为Combo1Combo2

现在我想将Visibility的{​​{1}}绑定到某事。

所需行为:

Combo2时,应该可以看到Combo2。

那么,我应该如何绑定Combo2的可见性?

更新:

根据你的回答,我试图像下面的代码一样实现IMultiValueConverter:

EffectsVisibilityConverter.cs

Combo1's first item is selected && SelectedMenuItem = 1

在Page.xaml:

public class EffectsVisibilityConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (!(values[0] == null || values[1] == null))
        {
            if (((int)values[0] == 1) && ((int)values[1] == 1))
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
        }
        else
        {
            return Visibility.Collapsed;
        }
    }

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

但问题是,Converter中值[0]的值始终为0。

3 个答案:

答案 0 :(得分:2)

您可以使用IMultiValueConverter并绑定,例如SelectedMenuItem和Combo1.SelectedIndex到转换器以确定Combo2的可见性。

我会优先采用这种方式,而不是创建新的viewmodel属性,因为它是纯ui逻辑,与viewmodels逻辑无关。

//修改

为什么你不像Kuna写的那样使用绑定?

<MultiBinding Converter="{StaticResource NameConverter}">
    <Binding Path="SelectedItem" ElementName="cbox1"/>
    <Binding Path="IsChecked" ElementName="chkbox"/>
</MultiBinding>

只需使用SelectedIndex而不是SelectedItem,一切都很好。

答案 1 :(得分:1)

Using MultiBinding and Converter  :instead of menuitem i've used Checkbox's ischecked

  <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication1"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:NameConverter x:Key="NameConverter"/>
        </Window.Resources>
        <Grid>

            <ComboBox x:Name="cbox1" VerticalAlignment="Center" Text="3"   MinHeight="20">
                <ComboBoxItem  Content="first" />
                <ComboBoxItem  Content="second"/>
                <ComboBoxItem  Content="third"/>
                <ComboBoxItem  Content="fourth"/>
            </ComboBox>

            <ComboBox VerticalAlignment="Bottom" Text="3"   MinHeight="20" >
                <ComboBox.Visibility>
                    <MultiBinding Converter="{StaticResource NameConverter}">
                        <Binding Path="SelectedItem" ElementName="cbox1"/>
                        <Binding Path="IsChecked" ElementName="chkbox"/>
                    </MultiBinding>
                </ComboBox.Visibility>
                <ComboBoxItem  Content="1" />
                <ComboBoxItem  Content="2"/>
                <ComboBoxItem  Content="3"/>
                <ComboBoxItem  Content="4"/>
                </ComboBox>
            <CheckBox x:Name="chkbox" Content="Isselected" HorizontalAlignment="Left" Margin="10,56,0,0" VerticalAlignment="Top"/>

        </Grid>
    </Window>


    {
         public partial class MainWindow : Window
            {
                public MainWindow()
                {
                    InitializeComponent();
                }
            }
            public class NameConverter : IMultiValueConverter
            {
                public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
                {
                    if ((values[0] is ComboBoxItem) && (values[0] as ComboBoxItem).Content.ToString() == "first" && (bool)values[1])

                        return Visibility.Visible;
                    else return Visibility.Collapsed;
                }

                public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
                {
                    return null;
                }
            }
    }

更新//

 <ComboBox.Visibility>
                    <MultiBinding Converter="{StaticResource NameConverter}">
                        <Binding Path="SelectedItem" ElementName="cbox1"/>
                        <Binding  Path="IsChecked">
                            <Binding.RelativeSource >
                                <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}" />
                            </Binding.RelativeSource>

                        </Binding>
                    </MultiBinding>
                </ComboBox.Visibility>

答案 2 :(得分:0)

只需将另一个属性添加到viewmodel并在其中执行逻辑。