自定义Silverlight控件绑定问题Lightswitch

时间:2014-12-29 09:18:31

标签: mvvm custom-controls silverlight-5.0 lightswitch-2012

我一直在与自定义控件绑定的某个问题作斗争我似乎无法解决。

我试图将从网上下载的向导控件绑定到我的某个屏幕,但出于某种原因绑定不会通过。

我已将问题缩小到一行代码,实际上是导致问题的代码。

private readonly MainPageViewModel vm;
    public MainPage()
    {
        InitializeComponent();
        vm = new MainPageViewModel();
        DataContext = vm;
    }

它覆盖了datacontext(使用MVVM模式打开主页VM)。

当我删除datacontext覆盖时,我的绑定工作完美,但所有其他控制功能都无法正常工作。

现在很明显我可能做错了什么或者我错过了什么,在你的帮助和专业知识的帮助下我希望能够解决这个问题。

当我绑定到我的屏幕时,这是自定义控件的XAML的一部分,可能是因为datacontext覆盖正在发生我需要将Source添加到我的绑定中,如果是这样的话源代码是什么?

<controls:TabItem Header="introduction"
                              Tag="WELCOME TO THE INSERT PRODUCT WIZARD"
                              Visibility="Collapsed" >
                <StackPanel>
                    <TextBox x:Name="txtTest" Width="300" Text="{Binding Path=Screen.intBindTest, Mode=TwoWay}"/>
                    <ComboBox  ItemsSource="{Binding Screen.vw_COUNTRIES, Mode=OneWay}" 
                               SelectedItem="{Binding Screen.vw_COUNTRIES.SelectedItem, Mode=TwoWay}"
                               DisplayMemberPath="COUNTRYNAME"/>
                </StackPanel>


            </controls:TabItem>

我的问题不是我如何绑定silverlight自定义控件,我的问题是当我明确地将一个datacontext指定为ViewModel然后LightSwitch绑定不起作用但如果我删除它然后Lightswitch可以绑定好但其余的控制权被打破了。

我需要的是如何从XAML或任何其他方式明确地将lightswitch datacontext分配到我的文本框中。

提前多多谢谢。

2 个答案:

答案 0 :(得分:0)

  1. 将自定义控件添加到屏幕时,请将绑定源保留为屏幕。
  2. 确保您有收集&#39; vw_COUNTRIES&#39;在屏幕上。

答案 1 :(得分:0)

我找到了解决问题的方法。

如果您没有为其明确指定上下文,则用户控件仅获取屏幕数据上下文,默认情况下它将获取它。 但当我用我的VM显式覆盖它时,上下文不再来自屏幕了。

解决方案是在Microsoft.LightSwitch.Client.Internal DLL中挖掘并寻找自定义控件的父控件后是LS。

之后我将DLL添加到我的解决方案中,这样我就可以引用该DLL并使用对象类型,并添加了一个像这样的datacontext绑定。

<TextBox Grid.Row="1" x:Name="txtTest" Width="300" Text="{Binding Path=Screen.intBindTest, Mode=TwoWay}"
                             DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                        AncestorType=LS:ScreenCustomContentControl ,AncestorLevel=1}, Path=DataContext}"/>
                        <ComboBox Grid.Row="2"  Name="cmbTest" ItemsSource="{Binding Screen.vw_COUNTRIES, Mode=TwoWay}" 
                               SelectedItem="{Binding Screen.vw_COUNTRIES.SelectedItem, Mode=TwoWay}"
                               DisplayMemberPath="COUNTRYNAME"
                               DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
                        AncestorType=LS:ScreenCustomContentControl ,AncestorLevel=1}, Path=DataContext}"/>

这解决了我的问题。