仔细检查 - 拥有内部viewmodel类是否有意义?

时间:2011-09-27 21:50:39

标签: .net wpf silverlight binding

我相信我们无法绑定到内部视图模型。

因此,我认为IValueConverter,IMultiValueConverter,INotifyPropertyChanged,INotifyCollectionChanged的所有绑定相关实现都应该始终公开,以便与XAML一起使用。

这是对的吗?

更新:这不是一个简单的问题,因为有各种可能的奇怪情况,例如嵌套的viewmodel类,或显式接口实现或其他我不知道哪些可能可能导致不同的答案。我们已经可以看到WPF和SL4.0由于某种原因对内部视图模型的处理方式不同。

3 个答案:

答案 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中:

  1. “我相信我们无法绑定到内部视图模型” - 是的,我们不能 绑定到内部类,也不能绑定到内部或私有 属性,给出绑定错误。

  2. “IValueConverter,IMultiValueConverter的实现” - 是的也应该公开

  3. “INotifyPropertyChanged,INotifyCollectionChanged” - 这些接口由ViewModel类和一些将被绑定的集合实现,因此这些类应该是公共的,如我们所知。实现接口的方法和事件显然不是私有的或内部的。

  4. 在WPF中:

    1. “我相信我们无法绑定到内部视图模型” - 我们可以绑定到内部类,但我们无法绑定到内部或私有属性。

    2. “IValueConverter的实现,IMultiValueConverter” - 可以是内部的

    3. “INotifyPropertyChanged,INotifyCollectionChanged” - 请参阅前几点。

答案 1 :(得分:1)

您无法绑定到内部属性,但只要属性是公共的,源对象(例如DataContext)的可访问性无关紧要。

根据类和程序集的功能,限制访问权限是另一个问题。我不是这方面的专家,但如果组件不会被另一个组件使用,那么你可能不需要担心它的外部接口可以使用internal进行控制。

答案 2 :(得分:1)

两种环境(Silverlight和WPF)表现不同的原因是因为银光反射限制。

在silverlight中,您无法使用reflection on internal or private members

因此,如果将viewmodel声明为internal,则silverlight将无法将其用于数据绑定。