假设我有一个名为MainWindow.xaml的窗口和一个名为Page.xaml的页面。
在MainWindow.xaml上:
我有Menu
和Frame
。在此Frame Page.xaml中显示。
DataContext
的{p> MainWindow.xaml
绑定到MainWindowViewModel
。
我在SelectedMenuItem
上有一个名为int
MainWindowViewModel
的属性。
因此,菜单的SelectedItem绑定到SelectedMenuItem
。
在Page.xaml:
我有2 ComboBoxes
名为Combo1
和Combo2
。
现在我想将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。
答案 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并在其中执行逻辑。