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

时间:2014-04-24 14:25:46

标签: c# wpf xaml mvvm

我正在尝试在组合框上发生“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>

任何人都有任何想法?

提前致谢。

2 个答案:

答案 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。