C# 通过ElementName从其他UserControl触发

C# 通过ElementName从其他UserControl触发,c#,wpf,xaml,C#,Wpf,Xaml,我有两个UserControlsA,B,我想从UserControlB获取UserControlA中的A_文本框错误。可能吗 <Usercontrol x:Class="A" (...)> <TextBox x:name="A_TextBox (...)/> </Usercontrol> <Usercontrol x:Class="B" (...)> (...) <Controls:A/> <But

我有两个UserControlsA,B,我想从UserControlB获取UserControlA中的A_文本框错误。可能吗

 <Usercontrol x:Class="A" (...)>
     <TextBox x:name="A_TextBox (...)/>
 </Usercontrol>


<Usercontrol x:Class="B" (...)>
(...)
   <Controls:A/>

   <Button (...)>
      <Button.Style>
          <Style>
             <Style.Triggers>        
                <DataTrigger Binding="{Binding Path=(Validation.HasError), ElementName=A_TextBox }" value="True">
                  <Setter Property="IsEnabled" Value="False" /> 
                </DataTrigger>
              </Style.Triggers>
此代码导致错误:

System.Windows.Data错误:4:找不到引用为“ElementName=A_TextBox”的绑定源。BindingExpression:Path=0;DataItem=null;目标元素是“按钮”名称=;目标属性为“NoTarget”类型“Object”


我创建了两个UserControl,A和B。A有一个文本框,其文本绑定到UserControl的整数属性,A还有一个公共只读依赖属性HasError。我收到一个错误,说明Validation.HasError无法进行数据绑定,因此我正在文本更改事件处理程序中手动更新该属性。我创建并包含Integer属性,以便在文本框中键入xx并使Validation.HasError为true。任何具有有效性验证的操作都将同样有效

在公共父级中,我通过布尔求反值转换器将A.HasError绑定到B.IsEnabled。我也可以写一个像你一样的触发器。这种方法的优点是,除了可以工作之外,两个UserControls不必知道彼此的内部结构,而且两者都不依赖于对方。此外,如果您想在ListBox的ItemTemplate中创建其中的九对,那么您可以毫无问题地创建它们

A.xaml

<TextBox 
    VerticalAlignment="Top"
    TextChanged="IntegerTextBox_TextChanged"
    Text="{Binding Integer, RelativeSource={RelativeSource AncestorType=UserControl}, UpdateSourceTrigger=PropertyChanged}"
    />
MainWindow.xaml

<Window.Resources>
    <local:NotConverter x:Key="Not" />
</Window.Resources>
<Grid>
    <StackPanel>
        <local:A 
            Integer="34" 
            x:Name="MyAInstance" 
            />
        <local:B
            IsEnabled="{Binding HasError, ElementName=MyAInstance, 
                        Converter={StaticResource Not}}"
            />
    </StackPanel>
</Grid>

它是。您必须使它们共享一个视图模型。至少对于这个特定的绑定。
<Window.Resources>
    <local:NotConverter x:Key="Not" />
</Window.Resources>
<Grid>
    <StackPanel>
        <local:A 
            Integer="34" 
            x:Name="MyAInstance" 
            />
        <local:B
            IsEnabled="{Binding HasError, ElementName=MyAInstance, 
                        Converter={StaticResource Not}}"
            />
    </StackPanel>
</Grid>
public class NotConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !System.Convert.ToBoolean(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return !System.Convert.ToBoolean(value);
    }
}