我正在尝试将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的可见性只会是折叠或可见。
任何帮助都会很棒,我对整个数据绑定概念都很陌生。
答案 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;
}