WPF数据绑定问题 - 可能的Noob问题

时间:2013-02-04 17:51:29

标签: c# .net wpf data-binding binding

我正在尝试将Visibility类型的ViewModel属性绑定到Dock Panel上的visibility属性:

更新了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的visibility属性通过绑定设置为Visible。然后当您再次单击btnSelectWafer时,tvwDockPanel的visibility属性将再次设置回Collapsed。 tvwDockPanel的可见性只会是折叠或可见。

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

2 个答案:

答案 0 :(得分:3)

这里有几个问题:

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

我不清楚你的SelectWaferButtonViewModel班级用Button做了什么,但你需要从那里删除按钮。

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

视图模型:

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}}"/>

答案 1 :(得分:0)

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

更改为:

private void SetDataContexts()
{
    tvwDockPanel.DataContext = btnSelectWaferViewModel;
}