如何让按钮的Click事件在MVVM中操纵另一个控件?

本文关键字:MVVM 操纵 另一个 控件 事件 按钮 Click | 更新日期: 2023-09-27 18:16:03

我使用WPF(4.5)和Caliburn.Micro。我试图了解如何在我的视图中有一个"事件"在我的视图中操纵其他控件。

例如:

我的视图有一个扩展控件,一个按钮和一个GridView。GridView在扩展器内部。当用户单击按钮时,它调用VM中的一个方法,该方法使用BindableCollection<>填充gridview。我想要发生的是,当该集合有多于1个项目时,我想自动展开扩展器控件。

想法?

如何让按钮的Click事件在MVVM中操纵另一个控件?

您可以绑定集合中的项数:

<Expander IsExpanded="{Binding Path=YourCollection.Length, Converter={StaticResource ResourceName=MyConverter}" />

,然后在窗口或usercontrol:

<UserControl... xmlns:converters="clr-namespace:My.Namespace.With.Converters">
    <UserControl.Resources>
        <converters:ItemCountToBooleanConverter x:Key="MyConverter" />
    </UserControl.Resources>
</UserControl>

和转换器:

namespace My.Namespace.With.Converters {
    public class ItemCountToBooleanConverter : IValueConverter 
    {
        // implementation of IValueConverter here
        ...
    }
}

这是我写出来的,所以如果它包含错误,我道歉;)

Also:确保你的viewModel实现了INotifyPropertyChanged接口,但我假设你已经知道了。

@cguedel方法是完全有效的但是如果你不想使用转换器(为什么多一个类)那么在你的视图模型中有另一个类型为bool的属性可能叫做ShouldExpand,为什么说这么多,让我给你看:

class YourViewModel {
    public bool ShouldExpand {
        get {
            return _theCollectionYouPopulatedTheGridWith.Length() != 0;
            // or maybe use a flag, you get the idea !
        }
    }
    public void ButtonPressed() {
        // populate the grid with collection
        // NOW RAISE PROPERTY CHANGED EVENT FOR THE ShouldExpand property
    }
}

现在在你的视图中使用这个绑定:

<Expander IsExpanded="{Binding Path=ShouldExpand}" />

正如我之前所说的,另一个解决方案是好的,但我喜欢减少我的解决方案中的类的数量。这是另一种方法