C# 窗口上同级控件的访问值

C# 窗口上同级控件的访问值,c#,wpf,xaml,multibinding,C#,Wpf,Xaml,Multibinding,我的窗口中有这个。参考资料: <Window.Resources> <ValueConverters:StudyPointWorkingOn x:Key="StudyPointWorkingOn" /> <Style x:Key="StudyPointComboBoxStyle" TargetType="ComboBoxItem"> <Setter Property="Tag" Value="{Binding Numbe

我的
窗口中有这个。参考资料

<Window.Resources>
    <ValueConverters:StudyPointWorkingOn x:Key="StudyPointWorkingOn" />

    <Style x:Key="StudyPointComboBoxStyle" TargetType="ComboBoxItem">
        <Setter Property="Tag" Value="{Binding Number}" />
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource StudyPointWorkingOn}">
                        <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
                        <Binding Path="DataContext.SelectedStudentItem" ElementName="oclmEditor" UpdateSourceTrigger="PropertyChanged" />
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="Background" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="StudyPointComboItem">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Number}"/>
            <TextBlock Text=" - "/>
            <TextBlock Text="{Binding Title}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>
我把它放在上下文中,以说明我的问题。首先,我必须指出,它的工作原理是这样的。我现在遇到的问题是,我想稍微改变一下逻辑

通过两个控件查看位于组合框前面的
文本框
对象:

<TextBox x:Name="textBibleReadingMain" Grid.Column="0" Margin="2" IsEnabled="False"
        Text="{Binding BibleReadingMainName, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
因此,在每个实例中,[Text]元素都有不同的名称,关联的属性也会不同。是否有任何方法可以让我仍然使用一个资源,但以某种方式传递
TextBox.Text
或相应的
属性
?我知道我可以使用
相对资源
,但这是为了寻找祖先,而这更像是一个侄子……:)

更新 谢谢你迄今为止提供的答案。请允许我向您展示我所做的工作,因为我还不太清楚如何按照您的建议使用
ViewModel
实现这一点

  • 我调整了我的
    窗口。参考资料

    }

  • 最后,我必须向ViewModel添加一个公共包装器方法:

    this.ReadingStudyPointsList.Add(new ReadingStudyPointItemViewModel(this, other parameters))
    
    公共学生查找学生(字符串学生) { 返回_Model.FindStudent(strStudent); }


  • 上述方法对我来说很有效。但是提供的答案是使用
    ViewModel
    包装
    StudyPointItem
    和相关的
    名称
    属性。我不太清楚提议的代码是如何反映上述工作流程的。

    IMO,我不是在控件树中查找信息,而是以某种方式将必要的信息传递给您绑定的每个项目。因此,我认为它更易于维护,因为如果布局发生更改,则不必更新绑定

    在您的情况下,组合框的每个项目的DataContext都是ReadingStudyPointsList的每个元素。因此,您可以在创建元素时传递对具有BibleReadingMainName,es-List的实际ViewModel的引用,并传递“this”实例以访问ViewModel的每个属性:

    this.ReadingStudyPointsList.Add(new ReadingStudyPointItemViewModel(this, other parameters))
    
    因此,在ReadingStudyPointItemViewModel中,您可以拥有一个属性,该属性保存在ctor中分配的父视图模型,以访问所需的信息:

    public ParentViewModel ParentVM { get; set; }
    
    最后,您的绑定将变成:

    <Style x:Key="StudyPointComboBoxStyle" TargetType="ComboBoxItem">
            <Setter Property="Tag" Value="{Binding Number}" />
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource StudyPointWorkingOn}">
                            <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
                            <Binding Path="DataContext.SelectedStudentItem" ElementName="oclmEditor" UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="DataContext.ParentVM.BibleReadingMainName" />
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    
    
    

    我希望这对您有用。

    在我看来,我不是在控件树中查找信息,而是以某种方式将必要的信息传递给您绑定的每个项目。因此,我认为它更易于维护,因为如果布局发生更改,则不必更新绑定

    在您的情况下,组合框的每个项目的DataContext都是ReadingStudyPointsList的每个元素。因此,您可以在创建元素时传递对具有BibleReadingMainName,es-List的实际ViewModel的引用,并传递“this”实例以访问ViewModel的每个属性:

    this.ReadingStudyPointsList.Add(new ReadingStudyPointItemViewModel(this, other parameters))
    
    因此,在ReadingStudyPointItemViewModel中,您可以拥有一个属性,该属性保存在ctor中分配的父视图模型,以访问所需的信息:

    public ParentViewModel ParentVM { get; set; }
    
    最后,您的绑定将变成:

    <Style x:Key="StudyPointComboBoxStyle" TargetType="ComboBoxItem">
            <Setter Property="Tag" Value="{Binding Number}" />
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource StudyPointWorkingOn}">
                            <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
                            <Binding Path="DataContext.SelectedStudentItem" ElementName="oclmEditor" UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="DataContext.ParentVM.BibleReadingMainName" />
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    
    
    

    我希望这对您有用。

    正确的视图模型是最佳选择。使用ViewModel属性绑定可以轻松地在控件之间传递值。@AnjumSKhan问题在于对多个控件使用模板代码。我有权使用这些房产。今天晚些时候,我将介绍如何使用Tag属性。如果我将适当的name属性绑定到组合框标记,那么我可以将其传入。然后,我的代码仍然是通用的,可以在12个不同的位置使用。您的StackPanel及其内容保持不变,但TextBox(和/或控件)的名称发生了变化?@AnjumSKhan No.我有12个和12个文本框。但每个组合都与每个文本框相关。您有相同的StackPanel,但它出现在12个位置,文本框有不同的名称。就像我们有
    按钮
    控件一样,它出现在多个地方。同一个控件的自定义版本出现在不同的位置。正确的ViewModel将是一种选择。使用ViewModel属性绑定可以轻松地在控件之间传递值。@AnjumSKhan问题在于对多个控件使用模板代码。我有权使用这些房产。今天晚些时候,我将介绍如何使用Tag属性。如果我将适当的name属性绑定到组合框标记,那么我可以将其传入。然后,我的代码仍然是通用的,可以在12个不同的位置使用。您的StackPanel及其内容保持不变,但TextBox(和/或控件)的名称发生了变化?@AnjumSKhan No.我有12个和12个文本框。但每个组合都与每个文本框相关。您有相同的StackPanel,但它出现在12个位置,文本框有不同的名称。就像我们有
    按钮
    控件一样,它出现在多个地方。同一个控件的自定义版本出现在不同的位置。谢谢您的回答。我很难按照您的建议去做,因为您已经将
    BibleReadingMainName
    属性硬编码到了generic
    样式中。对于每个
    组合框
    ,此属性需要不同。我已使用
    组合框
    标记
    属性解决了问题底部所述的问题。感谢您的回答。我很难按照您的建议去做,因为您已经将
    BibleReadingMainName
    属性硬编码到了generic
    样式中。此属性需要dif