如何将元数据与WPF中许多不同类型的控件相关联?

如何将元数据与WPF中许多不同类型的控件相关联?,wpf,xaml,user-interface,reactiveui,Wpf,Xaml,User Interface,Reactiveui,我有一堆控件,根据其他控件中的错误可以启用也可以不启用。当一个控件被禁用时,我想向用户解释为什么它当前被禁用。但是,我已经在使用帮助文本的工具提示。因此,我认为当用户将鼠标移到灰显组件上时,会在静态文本框中显示错误消息 简化的xaml: <StackPanel Margin="10 10 10 10"> <TextBox x:Name="thtkDirTextBox" ToolTip="yadda yadda help text"/> <TextBo

我有一堆控件,根据其他控件中的错误可以启用也可以不启用。当一个控件被禁用时,我想向用户解释为什么它当前被禁用。但是,我已经在使用帮助文本的工具提示。因此,我认为当用户将鼠标移到灰显组件上时,会在静态文本框中显示错误消息

简化的xaml:

<StackPanel Margin="10 10 10 10">
    <TextBox x:Name="thtkDirTextBox" ToolTip="yadda yadda help text"/>
    <TextBox x:Name="tououDatTextBox" ToolTip="yadda yadda help text"/>
    <ComboBox x:Name="touhouExeSelector" ToolTip="yadda yadda help text"/>
    <ComboBox x:Name="stageSelector" ToolTip="yadda yadda help text"/>
    <ComboBox x:Name="sceneSelector" ToolTip="yadda yadda help text"/>
    <GroupBox Header="Errors">
        <TextBox IsEnabled="False" TextWrapping="Wrap" Width="200" FontSize="10" Height="50">
            Mouse over an item that's grayed out and the reason why will appear here.
        </TextBox>
    </GroupBox>
    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
        <Button Content="Save as..." ToolTip="yadda yadda help text"></Button>
        <Button Content="Quick Play" ToolTip="yadda yadda help text"></Button>
    </StackPanel>
</StackPanel>
我还没有决定如何连接鼠标悬停事件。还没走那么远

我看到还有一个标签属性。这是对房产的合理使用吗

更好的方法是创建一个可以在任何元素上设置的强类型。只需定义一个静态类,在其中注册属性:

public static class Metadata
{
    public static readonly DependencyProperty InfoProperty = DependencyProperty.RegisterAttached(
          "Info",
          typeof(string),
          typeof(Metadata),
          new FrameworkPropertyMetadata(null));

    public static void SetInfo(UIElement element, string value) => element.SetValue(InfoProperty, value);

    public static string GetInfo(UIElement element) => (string)element.GetValue(InfoProperty);
}
您可以在任何UIElement上设置它,如下所示:

<TextBox IsEnabled="False" TextWrapping="Wrap" Width="200" FontSize="10" Height="50"
             local:Metadata.Info="Mouse over an item that's grayed out and the reason why will appear here.">
</TextBox>

可以使用附加的依赖项属性。它可以应用于任何控件,而无需创建子类我应该在这里做什么这个问题太宽泛了。也就是说:若你们觉得标签有用的话,它就在那个里供你们使用。若您需要将其用于多个项目,请使用多个项目存储一个用户定义的类型。也就是说,你的问题中没有太多细节,可能有很多合法的方法来解决这个问题。例如,您没有解释实际使用什么机制来禁用基于错误的控件。也不知道错误是如何传播的。也不知道如何使用工具提示,如果这是一个选项,也就是说,如果您没有将工具提示用于其他用途的话。@PeterDuniho我添加了其他详细信息,说明如何使用ReactiveUI获取一个控件中发生的错误,并将其传播到依赖它们的所有其他控件,以及我将如何使用工具提示视图中的所有控件都绑定到viewmodel中的属性吗?每个控件都有几个属性绑定到viewmodel的属性。一个用于IsEnabled,一个用于ItemsSource或Text,最近一个用于Tag,因为我尝试了这个。任何一个控件的viewmodel上的所有属性都来自非常密切相关的IObservable流。我只是对Eithers流做了不同的事情。啊,谢谢,我曾尝试过,但不知道如何设置值。不知怎的,我没有想到我可以直接使用GetInfo/SetInfo。。。我假设它们只用于框架。
<TextBox IsEnabled="False" TextWrapping="Wrap" Width="200" FontSize="10" Height="50"
             local:Metadata.Info="Mouse over an item that's grayed out and the reason why will appear here.">
</TextBox>
string info = Metadata.GetInfo(theControl);