我正在尝试将我的控制台应用程序转换为一个漂亮的WPF GUI。我对这段代码感到有些困惑,并想知道是否有人可以提供帮助?
在我的xaml中我有这个:
<CheckBox IsChecked="{Binding CL.LoggedIn}"></CheckBox>
尝试将复选框的值绑定到CL.LoggedIn的值。 CL是引用类库中的ConnectionLibrary.cs类。
在xaml页面的代码中,我按如下方式声明CL:
public ConnectionLibrary CL = new ConnectionLibrary();
在连接库类中,我添加了:INotifyPropertyChanged到类声明并添加了以下代码:
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
我已将LoggedIn属性更改为现在如下所示:
private bool loggedIn;
public bool LoggedIn {
get { return loggedIn; }
set { loggedIn = value; OnPropertyChanged("LoggedIn"); }
}
然而,它似乎不适用于我的xaml?我没有在输出窗口中得到任何绑定错误,但它没有正确反映LoggedIn的值。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
您是否设置了视图的datacontext? 在XAML文件的代码隐藏中,您需要执行以下操作:
this.DataContext = CL;
然后绑定是:
<CheckBox IsChecked="{Binding LoggedIn}"></CheckBox>
绑定将在DataContext中的对象上找到命名路径(即LoggedIn)。
编辑:默认绑定是单向的,这意味着它只能从您的ViewModel更新。
对于可以输入数据的控件(即:TextBox,CheckBox ...),您可以将Binding设置为“TwoWay”。 Binding表达式变为:
<CheckBox IsChecked="{Binding LoggedIn, Mode="TwoWay"}"></CheckBox>
现在每当Checked状态在UI中发生变化时,它都会反映在ViewModel中。
答案 1 :(得分:2)
当你像这样使用Binding
时,它会绑定到当前的DataContext
,而不会绑定到页面本身。
解决此问题的最简单方法是在页面构造函数的末尾设置DataContext = this
。
解决问题的正确方法是使用MVVM。这意味着在另一个类的属性中使用ConnectionLibrary
并将DataContext
设置为此另一个类。
答案 2 :(得分:0)
<CheckBox IsChecked="{Binding LoggedIn}"></CheckBox>