如何在工具提示中绑定其他元素

时间:2018-11-15 03:37:31

标签: c# wpf binding anchor relativesource

我想在工具提示中绑定文本,但是我有一个问题,它的绑定值是其他元素控件,因此我基本上无法通过绑定获取它们的值。

public partial class Form1 : Form
    { String conString = @"Provider = Microsoft.Jet.OLEDB.4.0;
      Data Source = '‪C:\Users\Army\Desktop\Template %P%Q.xls';
      Extended Properties = Excel 4.0 ;";
      OleDbConnection conn;
      OleDbDataAdapter adp;
 public Form1()
    {
        InitializeComponent();
    }
 private void button2_Click(object sender, EventArgs e)
    {

        conn = new OleDbConnection(conString);
        String excel = "SELECT * FROM [PQLine2$]";
        adp = new OleDbDataAdapter(excel,conn);
        DataSet ds = new DataSet();
        adp.Fill(ds);                     // error in this line 
        dataGridView5.DataSource = ds;
        conn.Close();
        DataTable dt = new DataTable();
        adp.Fill(dt);
        dataGridView5.DataSource = dt;
    }
}

基本上我尝试绑定此代码。

2 个答案:

答案 0 :(得分:0)

如果查看输出,将会看到错误:

  

System.Windows.Data错误:4:找不到与之绑定的源   参考“ ElementName = txb2”。 BindingExpression:Path = Text;   DataItem = null;目标元素是“运行”(HashCode = 58577354);目标   属性为“文本”(类型为“字符串”)

您可以使用x:Reference来解决它:

<TextBlock x:Name="txb2" Text="Hello Stackoverflow"/>

<TextBox Grid.Row="1">
    <TextBox.ToolTip>
        <TextBlock>
            <Run Text="{Binding Source={x:Reference txb2}, Path=Text}" FontWeight="Bold"/>
        </TextBlock>
    </TextBox.ToolTip>
</TextBox>

关于ElementName和x:Reference之间的区别,请看以下thread。由于Tooltip不是Ui属性,因此ElementName不起作用,但是ElementName在搜索txb2时仅适用于Ui元素层次结构(可视树)。

答案 1 :(得分:0)

工具提示存在于可视树的外部,因此无法按名称引用其他控件。工具提示仅知道其自己的PlacementTarget-针对其显示的UIElement。

允许工具提示引用其他控件的一种方法是劫持此放置目标控件的一些其他未使用的属性(Tag最适合),然后可以由工具提示引用。

<TextBox x:Name="txb2" Text="Hello Stackoverflow" Width="200" />

<TextBox Grid.Row="1" Tag="{Binding ElementName=txb2}" Width="200">
    <TextBox.ToolTip>
        <ToolTip DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
            <TextBlock>
                <Run Text="{Binding Text}" FontWeight="Bold" />
            </TextBlock>
         </ToolTip>
    </TextBox.ToolTip>
</TextBox>

如果您使用的是MVVM设计模式,则另一种方法(不需要属性劫持)是绑定到PlacementTarget的DataContext(通常是ViewModel)。然后,您可以将工具提示的内容绑定到所需的任何属性。

<ToolTip DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
    ....