这主要是出于好奇心问题,希望能帮助我更好地理解绑定,XAML和扩展语法。
所以我只想将MainWindow中的绑定源更改为我在MainWindow中实例化的对象。
这是我的C#代码:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
favclass myfavclass = new favclass();
InitializeComponent();
this.DataContext = this;
}
string _myString = "hello";
public string MyString
{
get { return _myString; }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
}
public class favclass : INotifyPropertyChanged
{
int _myint = 34;
public int MyInt
{
get { return _myint; }
set { _myint = value; }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
}
}
和我的XAML
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" >
<Grid>
<TextBlock Height="50" Width="50" Text="{Binding MyString}"/>
<TextBlock Height="50" Width="48" Margin="200,100,100,100"
Text="{Binding Source=myfavclass, Path=MyInt}"/>
</Grid>
</Window>
因此,您可以看到我想首先在主窗口中显示MyString属性。
然后我想从myfavclass对象中显示MyInt。但当然MyInt并没有出现。我已经尝试了我能想到的每一种变化。
我错过了什么XAML?为什么我没有工作的XAML?
由于
答案 0 :(得分:1)
favclass myfavclass = new favclass();应该从init方法声明,或者你不会得到this.myfavclass实例
答案 1 :(得分:1)
Source=myfavclass
这是错误的。 Source
只能使用以下元素语法直接分配 :
<Binding>
<Binding.Source>
<!-- value here -->
</Binding.Source>
</Binding>
或者您可以使用StaticResource
或DynamicResoure
或某些自定义MarkupExtension
,如下所示:
Text="{Binding Source={StaticResource someKey}, Path=MyInt}"
或使用新功能{x:Reference}
直接引用XAML中的某些命名元素:
Text="{Binding Source={x:Reference someName}, Path=MyInt}"
此外,myfavclass
在代码后面被声明为局部变量。在XAML代码中无法使用(引用)。
你正在做一些叫做多视图模型的事情。如果是这样,您应该为您的控件提供多个DataContext。我更喜欢使用嵌套的视图模型。要实现这一点,您可以尝试修改MainWindow
,如下所示:
public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
_myfavclass = new favclass();
InitializeComponent();
this.DataContext = this;
}
private readonly favclass _myfavclass;
//we will use this property inside XAML code
public favclass MyFavClass {
get {
return _myfavclass;
}
}
}
现在在XAML代码中,您可以将文本绑定到MyFavClass.MyInt
,请注意DataContext
隐式是绑定的来源,因此您只需指定Path
:
<TextBlock Height="50" Width="48" Margin="200,100,100,100"
Text="{Binding Path=MyFavClass.MyInt}"/>
使用MyInt
未正确实施INotifyPropertyChanged
(但我希望您已经知道)。