2016-01-26 47 views
0

在菜單項的標題綁定的ElementName

我嘗試文本框在菜單項的標題,菜單項的Tag屬性的文字綁定。 但它不能正確工作,總是在標籤屬性中得到空值。

代碼像下面...

 <Button x:Name="Button1" Content="Test" HorizontalAlignment="Left" Width="182" Height="34" VerticalAlignment="Top" Margin="160,113,0,0"> 
     <Button.ContextMenu> 
      <ContextMenu PlacementTarget="{Binding ElementName=Button1}" Placement="Bottom"> 
       <MenuItem Tag="{Binding ElementName=TextBox1, Path=Text}" Click="MessageBox_ShowTag"> 
        <MenuItem.Header> 
         <Grid Height="25" MinWidth="153"> 
          <Label Content="Label1" Width="86" HorizontalAlignment="Left" VerticalContentAlignment="Center"/> 
          <TextBox x:Name="TextBox1" VerticalContentAlignment="Center" Margin="91,0,0,0"/> 
         </Grid> 
        </MenuItem.Header> 
       </MenuItem> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 

當點擊菜單項,調用消息框來顯示標籤的菜單項 (MessageBox.Show((發件人爲菜單項).TAG?的ToString( ));)

MessageBox已顯示,但內容始終爲空。

結果: Result

我怎樣才能綁定到文本框?

+0

你試圖解決什麼問題?可以有更好的解決方案,而不是存儲在標籤中。 –

+0

實際上,我想將TextBox.Text綁定到我的附加屬性菜單項。然後當點擊菜單項時,我可以通過發件人在Click_Event中獲取值。我也有其他菜單項沒有文本框,但也有附加屬性(只需寫在XAML),所以我可以通過用戶點擊任何菜單項獲取值。 – PGCafe

回答

1

我不知道爲什麼你必須綁定它這樣。另一種方法是綁定到一個屬性(此處MyText)實現INotifyPropertyChanged,然後通過DataContext像這樣的菜單:

<Button x:Name="Button1" Content="Test" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <Button.ContextMenu> 
       <ContextMenu Placement="Bottom" DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
        <MenuItem> 
         <MenuItem.Header> 
          <Grid Height="25" MinWidth="153"> 
           <Label Content="Label1" Width="86" HorizontalAlignment="Left" VerticalContentAlignment="Center"/> 
           <TextBox Name="TextBox1" Text="{Binding Path=MyText}" 
             VerticalContentAlignment="Center" Margin="91,0,0,0"/> 
          </Grid> 
         </MenuItem.Header> 
        </MenuItem> 
       </ContextMenu> 
      </Button.ContextMenu> 
     </Button> 

,然後Click事件不中繼獲得TextBox價值可言。

如果你想知道你的綁定不起作用的原因,那麼你的MenuItemNamescope找不到名爲TextBox1的對象。如果你必須(名稱範圍是有點棘手),你可以讓它通過爲TextBox創建一個新的Namescope爲您MenuItem和註冊名工作:

NameScope.SetNameScope(mi1, new NameScope()); 
mi1.RegisterName("TextBox1", TextBox1); 

其中mi1是你MenuItem的名字,那麼你的結合將工作:

<Button x:Name="Button1" Content="Test" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <Button.ContextMenu> 
     <ContextMenu Placement="Bottom"> 
      <MenuItem Tag="{Binding ElementName=TextBox1, Path=Text}" Click="MessageBox_ShowTag" Name="mi1"> 
       <MenuItem.Header> 
        <Grid Height="25" MinWidth="153"> 
         <Label Content="Label1" Width="86" HorizontalAlignment="Left" VerticalContentAlignment="Center"/> 
         <TextBox Name="TextBox1" VerticalContentAlignment="Center" Margin="91,0,0,0"/> 
        </Grid> 
       </MenuItem.Header> 
      </MenuItem> 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

此外,避免x:Name只要你能。 It can cause some nasty memory leaks。改爲使用名稱。

+0

我無法在代碼中獲取TextBox1。所以我不能使用「mi1.RegisterName(」TextBox1「,TextBox1);」這個註冊TextBox。 但是,感謝您的其他信息,瞭解了很多。 – PGCafe

0

嘗試通過RelativeSource結合:

<TextBox x:Name="TextBox1" Text="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType={x:Type MenuItem}}}" VerticalContentAlignment="Center" Margin="91,0,0,0"/> 
+0

他想將MenuItem的Tag屬性綁定到TextBox的Text屬性。你提供了相反的解決方案。 – chameleon86

+0

呃,你是對的。我會用灰燼遮住我的頭。但它仍然有效;這要歸功於'DependencyProperty'和'TwoWay'數據綁定模式。 –

0

就像在評論中提到的那樣,可能會有更好的解決方案來解決您正在嘗試解決的實際問題。

但無論如何,如果你想爲你的特定問題的解決方案,可以通過代替ElementName使用x:Reference這樣解決:

<MenuItem Tag="{Binding Source={x:Reference TextBox1}, Path=Text}"/> 

elementName爲不工作,因爲的VisualTree是不同的。如果有興趣進一步閱讀 - ElementName v/s x:Reference

+0

我得到空引用錯誤 – PGCafe

+0

@PGCafe - 這只是設計師的錯誤。你有沒有試過運行你的代碼,看看它是否有效? –