我正在尝试在组合框上发生“DropDownClosed”事件时更改文本框上的可见性。问题是,我不能使用代码隐藏(因此我认为是事件参与者?)因为我试图遵循模型 - 视图 - 视图模型设计。
我正在寻找的一个例子:
<Grid>
<ComboBox x:Name="Combobox">
<ComboBoxItem Content="true"/>
<ComboBoxItem Content="false"/>
</ComboBox>
<TextBlock Text="Some text" IsHitTestVisible="False">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Visible"/>
// Code that makes textbox visibility become "collapsed" when Combobox event "DropDownClosed" occurs.
</Style>
</TextBlock.Style>
</TextBlock>
任何人都有任何想法?
提前致谢。
答案 0 :(得分:0)
组合项目是否是固定列表,例如目前的真假?
如果是这样,您可以将选定的组合值绑定到视图模型上的属性,然后使用转换器转换文本块的可见性
答案 1 :(得分:0)
这是一个基于您发布的代码片段的简单工作示例。我会一步一步地完成它。
XAML(我使用StackPanel以方便使用。)
<StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
</StackPanel.Resources>
<ComboBox x:Name="Combobox"
SelectedIndex="{Binding Choice, Mode=TwoWay}">
<ComboBoxItem Content="true"/>
<ComboBoxItem Content="false"/>
</ComboBox>
<TextBlock Text="Some text" IsHitTestVisible="False" Visibility="{Binding Visible, Converter={StaticResource BoolToVisibilityConverter}}">
</TextBlock>
</StackPanel>
首先我们声明一个BooleanToVisibilityConverter资源。这是一个内置类,它可以完全满足您的需要,它将bool值转换为Visibility值
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
</StackPanel.Resources>
接下来,我们将ComboBox绑定到名为Choice的ViewModel的属性。请注意,我绑定了SelectedIndex属性
<ComboBox x:Name="Combobox"
SelectedIndex="{Binding Choice, Mode=TwoWay}">
<ComboBoxItem Content="true"/>
<ComboBoxItem Content="false"/>
</ComboBox>
最后,我将TextBlock的Visibility属性绑定到名为Visible的ViewModel的布尔属性,此绑定使用我们声明为资源的BooleanToVisibilty属性
<TextBlock Text="Some text" IsHitTestVisible="False"
Visibility="{Binding Visible, Converter={StaticResource BoolToVisibilityConverter}}">
</TextBlock>
我还删除了不需要的TextBlock样式。可以直接在TextBlock上设置可见性。
现在是ViewModel
public class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int choice = 0;
public int Choice
{
get { return choice; }
set
{
if (value != choice)
{
choice = value;
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs("Choice"));
}
Visible = choice == 0;
}
}
}
private bool visible = true;
public bool Visible
{
get { return visible; }
set
{
if (value != visible)
{
visible = value;
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs("Visible"));
}
}
}
}
}
正如我前面提到的,Choice属性被声明为一个int,并且在XAML中被绑定到SelectedIndex属性,该属性也是一个int。我这样做是为了简单起见,因为我不想引入另一个转换器来翻译你的&#34; true&#34;和&#34;假&#34;将字符串转换为true / false布尔值。我不认为这是一个理想的设计,但它符合它的目的。
Visible = choice == 0;
只要更改了Choice,此行就会设置布尔值Visible属性。如果index == 0(它是&#34; true&#34; ComboBox的字符串),则将其设置为true,否则将其设置为false。这反过来导致Visible属性引发通知,BoolToVisibility转换器在true时将该bool转换为Visibility.Visible,在false时转换为Visibility.Collapsed。