在没有代码绑定的情况下更改事件中对象的属性

本文关键字:事件 属性 对象 情况下 代码 绑定 | 更新日期: 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?

如果是这样,您可以将组合的选定值绑定到视图模型上的属性,然后使用转换器转换文本块的可见性