0

我正在尝试将 Visibility 类型的 ViewModel 属性绑定到 Dock 面板上的可见性属性:

更新了 ViewModel 代码

public class SelectWaferButtonViewModel : INotifyPropertyChanged
{
    private bool isClicked;

    public SelectWaferButtonViewModel()
    {
        isClicked = false;
    }

    public bool IsControlVisible
    {
        get
        {
            return isClicked;
        }
        set
        {
            isClicked = value;
            OnPropertyChanged("IsControlVisible");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnButtonClick()
    {
        if (isClicked)
        {
            IsControlVisible = false;
        }
        else
        {
            IsControlVisible = true;
        }
    }
    protected virtual void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

这是我更新的 XAML 代码

            <DockPanel
                Name="tvwDockPanel"
                Width="200"
                Visibility="{Binding IsControlVisible, FallbackValue=Collapsed, Converter={StaticResource BoolToVisConverter}}"
                DockPanel.Dock="Left">
                <DockPanel
                    DockPanel.Dock="Top"
                    Height="22">
                </DockPanel>

我在后面的代码中设置了数据上下文:

    tvwDockPanel.DataContext = btnSelectWaferViewModel;

其中 btnSelectWaferViewModel 是这种情况下的 ViewModel 对象。

为了好玩,这是我背后的代码

public partial class WaferTrackerWindow : Window
{
    List<ISubscribeEvents> subscriptionList;
    SelectWaferButtonViewModel btnSelectWaferViewModel;

    public WaferTrackerWindow()
    {
        InitializeComponent();

        this.InstantiateObjects();
        this.SubscribeEvents();
        this.SetDataContexts();
    }

    #region Methods

    private void SetDataContexts()
    {
        tvwDockPanel.DataContext = btnSelectWaferViewModel.IsControlVisible;
    }
    private void SubscribeEvents()
    {
        foreach (ISubscribeEvents subscriber in subscriptionList)
        {
            subscriber.SubscribeEvents();
        }
    }
    private void InstantiateObjects()
    {
        btnSelectWaferViewModel = new SelectWaferButtonViewModel();
        subscriptionList = new List<ISubscribeEvents>();
        subscriptionList.Add(
            new Classes.WaferTrackerWindow.SelectWaferButtonView(btnSelectWafer, btnSelectWaferViewModel));
    }

    #endregion
}

我想做的就是单击按钮 btnSelectWafer 并让 tvwDockPanel 的可见性属性通过绑定设置为可见性。然后,当您再次单击 btnSelectWafer 时,tvwDockPanel 的可见性属性将再次设置回 Collapsed。tvwDockPanel 的可见性只会是 Collapsed 或 Visible。

任何帮助都会很棒,我对整个数据绑定概念相当陌生。

4

2 回答 2

3

您在这里有几个问题:

首先,MVVM 的目的(如果您尝试使用 MVVM 来执行此操作)是将逻辑与表示分离。这意味着您的 ViewModel 决不能引用System.Windows.Controls.Button,也不能System.Windows.Visibility,也不能引用命名空间内的任何其他类System.Windows

我不清楚您的SelectWaferButtonViewModel班级对 Button 做了什么,但您需要从那里删除 Button。

此外,如果您需要从 ViewModel 层操作控件的可见性,则最好使用Boolean属性和BooleanToVisibilityConverterXAML 中的:

视图模型:

public bool IsControlVisible {get;set;} //Don't forget INotifyPropertyChanged!!

XAML:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<DockPanel Visibility="{Binding IsControlVisible, Converter={StaticResource BoolToVisConverter}}"/>
于 2013-02-04T18:01:04.433 回答
0

问题是您将您绑定DockPanel到视图模型的布尔属性,然后将VisiblityUI 元素的IsControlVisible属性设置为 datacontext 的属性(不存在)。

改成:

private void SetDataContexts()
{
    tvwDockPanel.DataContext = btnSelectWaferViewModel;
}
于 2013-02-04T19:16:30.953 回答