2012-11-06 119 views
0

我有一個文本菜單中的XAML定義,我修改代碼:WPF綁定到資源實例

ContextMenu EditContextMenu; 
EditContextMenu = (ContextMenu)this.FindResource("EditContextMenu"); 
//Modify it here... 

然後,我需要將其設置爲ContextMenu所有的文本框,DatePickers等在XAML主題文件使用數據綁定。我試着將屬性添加到主窗口:

public ContextMenu sosEditContextMenu 
    { 
     get 
     { 
      return EditContextMenu; 
     } 
    } 

......像這樣綁定它(如下因素是從主題文件與「FTWin」是我的主窗口Name其中sosEditContextMenu財產被定義):

<Style TargetType="{x:Type TextBox}"> 
    <Setter Property="ContextMenu" Value="{Binding Source=FTWin, Path=sosEditContextMenu}"/> 
</Style> 

...但它不起作用。我嘗試了各種各樣的東西,並且我得到關於資源沒有被發現或沒有發生的異常。

是我想要做的事情,如果是的話,我做錯了什麼? 我不知道setting the DataContext of an object could help,但通過代碼爲所有文本框設置它不是很好嗎?

回答

2

將您在xaml中定義的菜單放在可從文本框中看到的資源字典中,而不是使用綁定只是使用StaticResource將其鏈接到您的樣式中。

<Window x:Class="ContextMenu.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 

     <!-- The XAML defined context menu, note the x:Key --> 
     <ContextMenu x:Key="EditContextMenu"> 
      <ContextMenu.Items> 
       <MenuItem Header="test"/> 
      </ContextMenu.Items> 
     </ContextMenu> 

     <!-- This sets the context menu on all text boxes for this window .--> 
     <Style TargetType="{x:Type TextBox}"> 
      <Setter Property="ContextMenu" Value="{StaticResource EditContextMenu}"/> 
     </Style>   
    </Window.Resources> 

    <Grid> 

     <!-- no context menu needs to be defined here, it's in the sytle.--> 
     <TextBox /> 
    </Grid> 
</Window> 

,您仍然可以通過背後尋找資源

public MainWindow() 
{ 
    InitializeComponent(); 

    System.Windows.Controls.ContextMenu editContextMenu = (System.Windows.Controls.ContextMenu)FindResource("EditContextMenu"); 
    editContextMenu.Items.Add(new MenuItem() { Header = "new item" }); 
} 
+0

由於改變它的代碼。我曾經做過類似的事情,並且出於某種特殊原因,我得到了ContextMenu的兩個不同實例,或者我得到了一個''{DependencyProperty.UnsetValue}'對於屬性'ContextMenu''異常來說不是有效的值。我開始認爲'FindResource()'有時會返回不同的實例。由於情況並非如此,我想在合併資源字典的方式或/和我改變主題的方式上一定會出現問題。 – NoOne

+1

如果你在樣式上設置了x:Shared =「False」,FindResource會返回一個新的實例,任何周圍的人(也許試着強迫它爲true,看看它是否能解決你的問題)。 - 它不會出現在智能感知中,但它在那裏。 – Andy

+0

非常感謝! :)我想我知道會出現什麼問題。 – NoOne