我可以从 UserControl 绑定到 DataTemplate 吗?

Posted

技术标签:

【中文标题】我可以从 UserControl 绑定到 DataTemplate 吗?【英文标题】:Can I Bind from UserControl to DataTemplate? 【发布时间】:2022-01-20 05:05:21 【问题描述】:

我想从 UserControl 绑定到 DataTemplate。

但我得到错误

Cannot find source for binding with reference 'ElementName=LoginTextBox'. BindingExpression:(no path); DataItem=null; target element is 'Grid' (Name=''); target property is 'FocusedElement' (type 'IInputElement')

我的代码

<UserControl>
    <UserControl.Resources>
        
        <DataTemplate DataType="x:Type models:LocalAuthenticationMethod">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="72"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" VerticalAlignment="Center"
                       Text="uiCommon:LocalizationBinding ResourceName=Login"
                       FontSize="DynamicResource LoginWindowPropertiesFontSize"/>
                
                <!-- bind to here -->
                <ComboBox x:Name="LoginTextBox"
                      Grid.Column="1"
                      Height="24"
                      Text="Binding ElementName=Root, Path=DataContext.Login, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True"
                      ItemsSource="Binding ElementName=Root, Path=DataContext.AvailableUsers, Mode=OneWay"
                      IsEditable="True"
                      behavior:FocusAdvancement.AdvancesByEnterKey="True"
                      FontSize="DynamicResource LoginWindowPropertiesFontSize">
                    <b:Interaction.Behaviors>
                        <behavior:SelectTextOnGotFocusBehavior/>
                        <behavior:SelectTextOnTargetUpdatedBehavior/>
                    </b:Interaction.Behaviors>
                </ComboBox>
            </Grid>
        </DataTemplate>
    </UserControl.Resources>
    <Grid x:Name="Root">

        <!-- how to bind here? -->
        <Grid FocusManager.FocusedElement="Binding ElementName=LoginTextBox"> 
            <ContentControl>
                <ContentPresenter Content="Binding SelectedAuthenticationMethod, Mode=OneWay"/>
            </ContentControl>
        </Grid>
    </Grid>
</UserControl>

我想将 FocusedElement 绑定到 ElementName=LoginTextBox。我该怎么做?有可能吗?

【问题讨论】:

“有可能吗?” - 不,不是 @ASh :( 我们将不得不放弃数据模板并使用触发器 【参考方案1】:

有可能吗?

否,因为名称“LoginTextBox”仅在定义了ComboBoxDataTemplate 内可用。

Grid 位于不同的 XAML namescope 中,它对定义 LocalAuthenticationMethod 对象的视觉外观的各个元素一无所知。

【讨论】:

以上是关于我可以从 UserControl 绑定到 DataTemplate 吗?的主要内容,如果未能解决你的问题,请参考以下文章

让 WPF UserControl 删除自身和绑定的 Data-Object?

绑定到包含 ItemsControl 数据的 UserControl

绑定到 UserControl DependencyProperty

从 Catel WPF UserControl 中的 ResourceDictionary 中绑定

WPF - 将 UserControl 可见性绑定到属性

将UserControl绑定到ViewModel(Caliburn Micro WPF)