1、数据绑定时,实现INotifyPropertyChanged接口时,一定要注意要判断PropertyChanged是否为null,否则容易出exception
2、在调用PropertyChanged事件时,传入的参数sender一定要写this,而不要写new object,在silverlight中,new object()可能没问题,但是在wpf中会有问题,可能不会自动更新UI。
代码如下
public class BaseModel : INotifyPropertyChanged
{
protected void ChangeProperty(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
3、TreeView使用多层Model绑定时,可以使用HierarchicalDataTemplate,然后设置ItemSource,在其中使用Item的MouseLeftButtonDown事件时,可以在HierarchicalDataTemplate中的根元素上使用MouseLeftButtonDown事件来处理,然后根据这个根元素的TemplatedParent来取得TreeViewItem
代码如下:
<HierarchicalDataTemplate ItemsSource="{Binding OcSubFolders}">
<Grid HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MouseLeftButtonDown="Grid_MouseLeftButtonDown">
</Grid>
</HierarchicalDataTemplate>
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Grid grd = sender as Grid;
FolderModel folderCurrent = grd.DataContext as FolderModel;
folderCurrent.OcSubFolders = FolderHelper.GetSubFolders(folderCurrent.FolderPath);
}
<HierarchicalDataTemplate ItemsSource="{Binding OcSubFolders}">
<!--
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<EventSetter Event="TreeViewItem.MouseLeftButtonDown" Handler="Grid_MouseLeftButtonDown" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
-->
<Grid HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MouseLeftButtonDown="Grid_MouseLeftButtonDown">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Width="32"
Height="32"
Source="/Images/folder.png" />
<StackPanel Grid.Column="1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FolderName}" />
<TextBlock Text="(" />
<TextBlock Text="{Binding FolderSize, Converter={StaticResource sizeConverter}}" />
<TextBlock Text=")" />
</StackPanel>
<StackPanel>
<TextBlock Text="{Binding SubFolderCount, Converter={StaticResource ResourceKey=folderCountConverter}}" />
</StackPanel>
</StackPanel>
</Grid>
</HierarchicalDataTemplate>