我相信我们无法绑定到内部视图模型。
因此,我认为IValueConverter,IMultiValueConverter,INotifyPropertyChanged,INotifyCollectionChanged的所有绑定相关实现都应该始终公开,以便与XAML一起使用。
这是对的吗?
更新:这不是一个简单的问题,因为有各种可能的奇怪情况,例如嵌套的viewmodel类,或显式接口实现或其他我不知道哪些可能可能导致不同的答案。我们已经可以看到WPF和SL4.0由于某种原因对内部视图模型的处理方式不同。
答案 0 :(得分:3)
基于此代码进行了一些检查:
<UserControl>
<UserControl.Resources>
<sa1:TestValueConverter x:Key="TestValueConverter" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock Text="{Binding Data, Converter={StaticResource TestValueConverter}}" />
</Grid>
</UserControl>
public class TestViewModel : INotifyPropertyChanged
{
public string Data { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
public class TestValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return "-" + value.ToString() + "-";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
有趣的是,WPF和Silverlight的结果不同。
答案是:
在Silverlight中:
“我相信我们无法绑定到内部视图模型” - 是的,我们不能 绑定到内部类,也不能绑定到内部或私有 属性,给出绑定错误。
“IValueConverter,IMultiValueConverter的实现” - 是的也应该公开
“INotifyPropertyChanged,INotifyCollectionChanged” - 这些接口由ViewModel类和一些将被绑定的集合实现,因此这些类应该是公共的,如我们所知。实现接口的方法和事件显然不是私有的或内部的。
在WPF中:
“我相信我们无法绑定到内部视图模型” - 我们可以绑定到内部类,但我们无法绑定到内部或私有属性。
“IValueConverter的实现,IMultiValueConverter” - 可以是内部的
“INotifyPropertyChanged,INotifyCollectionChanged” - 请参阅前几点。
答案 1 :(得分:1)
您无法绑定到内部属性,但只要属性是公共的,源对象(例如DataContext
)的可访问性无关紧要。
根据类和程序集的功能,限制访问权限是另一个问题。我不是这方面的专家,但如果组件不会被另一个组件使用,那么你可能不需要担心它的外部接口可以使用internal
进行控制。
答案 2 :(得分:1)
两种环境(Silverlight和WPF)表现不同的原因是因为银光反射限制。
在silverlight中,您无法使用reflection on internal or private members。
因此,如果将viewmodel声明为internal,则silverlight将无法将其用于数据绑定。