在没有代码绑定的情况下更改事件中对象的属性
本文关键字:事件 属性 对象 情况下 代码 绑定 | 更新日期: 2023-09-27 17:59:47
当组合框上发生事件"DropDownClosed"时,我正试图更改文本框的可见性。问题是,我不能使用codeehind(我想也不能使用事件触发器?),因为我试图遵循模型-视图-视图模型的设计。
我正在寻找的一个例子:
<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>
有人有什么想法吗?
提前谢谢。
下面是一个基于您发布的代码片段的简单工作示例。我会一步一步地复习。
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绑定到ViewModel的一个名为Choice的属性。请注意,我正在绑定SelectedIndex属性
<ComboBox x:Name="Combobox"
SelectedIndex="{Binding Choice, Mode=TwoWay}">
<ComboBoxItem Content="true"/>
<ComboBoxItem Content="false"/>
</ComboBox>
最后,我将TextBlock的Visibility属性绑定到ViewModel的一个名为Visible的布尔属性,该绑定使用我们声明为资源的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。我这样做是为了简单起见,因为我不想引入另一个Converter来将"true"answers"false"字符串转换为true/false布尔值。我认为这不是一个理想的设计,但它符合目的。
Visible = choice == 0;
这一行在更改Choice时设置布尔值Visible属性。如果index==0(这是组合框的"true"字符串),它会将其设置为true,否则设置为false。这反过来又导致Visible属性引发通知,并且BoolToVisibility转换器将该布尔转换为Visibility。当为true或Visibility时可见。为false时折叠。
组合项是否会是一个固定列表,例如当前的true和false?
如果是这样,您可以将组合的选定值绑定到视图模型上的属性,然后使用转换器转换文本块的可见性