【问题标题】:Custom Silverlight Control Binding Issue Lightswitch自定义 Silverlight 控件绑定问题 Lightswitch
【发布时间】:2014-12-29 09:18:31
【问题描述】:

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

我正在尝试将从网络下载的向导控件绑定到我的一个屏幕,但由于某种原因,绑定无法通过。

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

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

它正在覆盖数据上下文(使用 MVVM 模式打开主页面 VM)。

当我删除数据上下文覆盖时,我的绑定工作正常,但所有其他控制功能都无法正常工作。

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

当我绑定到我的屏幕时,这是自定义控件的 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 自定义控件,我的问题是当我明确地将数据上下文指定为 ViewModel 时,LightSwitch 绑定不起作用,但如果我删除它,那么 Lightswitch 可以很好地绑定,但其余的控制被破坏了。

基本上我需要的是如何通过 XAML 或任何其他方式将 lightswitch 数据上下文显式分配到我的文本框中。

非常感谢。

【问题讨论】:

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


    【解决方案1】:
    1. 将自定义控件添加到屏幕后,将绑定源保留在屏幕上。
    2. 确保屏幕上有收藏“vw_COUNTRIES”。

    【讨论】:

    • 试过了,还是不行,问题是当你用vm覆盖datacontext时,它会擦除​​屏幕datacontext。
    【解决方案2】:

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

    如果你没有为它显式指定上下文,用户控件只会获取屏幕数据上下文,它会默认获取它。 但是当我用我的虚拟机显式覆盖它时,上下文就不再来自屏幕了。

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

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

    <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}"/>
    

    这解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多