2013-11-22 110 views
1

我有我可以肯定的一個荒謬無知的問題,但我反正問它,因爲我搜索和搜索,要麼不明白我的解決方案看到還是沒有找到我正在尋找的答案。綁定到ViewModel和CodeBehind中的屬性

我有一個MVVM應用程序。我的XAML是通過將DataContext設置爲虛擬機的屬性來填充屏幕上的數據項目的VM來設置的。我的CodeBehind不會擺弄數據,只會涉及到屏幕。

我現在要做的就是將某些UI元素綁定到foo.xaml.cs(CodeBehind)文件中的屬性。例如,我想在CB中指定FontSize對屬性的綁定,以便在CB的WindowInitialized處理程序中,它可以檢測屏幕大小並更改所有屏幕項的FontSize =所綁定的一個變量。

我可以通過在我的虛擬機中創建一個公共屬性來解決這個問題,然後將CB中的值「注入」到虛擬機中。我知道這會起作用,但這是一種迂迴的方式來獲得我想要的行爲,這並非一帆風順,我相信這是一種錯誤的行事方式。

我搜索周圍,並嘗試了諸如:

FontSize="{Binding RelativeSource={RelativeSource Self},Path="MyFontSize" 

(其中「MyFontSize」是一個公衆詮釋屬性)以及多種,我發現其他的例子,但都沒有奏效。

那麼具體的,如果我的代碼隱藏類被稱爲NameChangeSetupMainWindow,這就是那裏的「MyFontSize」性質的生活,

public partial class NameChangeSetupMainWindow : Window 
{ 
    private int m_fontSize = 14; 
    public int MyFontSize 
    { 
     get { return m_fontSize; } 
     set 
     { 
      if (m_fontSize != value)) 
      { 
       m_fontSize = (value > 0) ? value : 10; 
      } 
     } 
    } 
    ... 
    ... rest of the class... 
    ... 
} 

和VM被稱爲NameChangeSetupViewModel,這就是「真實」的數據就在這裏而在DataContext點ALA:

<Window.DataContext> 
    <local:NameChangeSetupViewModel/> 
</Window.DataContext> 

什麼是XAML綁定只涉及到UI的UI項(提示語法,字體大小,E tc)CodeBehind中的變量,而不是將它們放在VM中?

在此先感謝您提供的任何指導。

+0

'{RelativeSource Self}'只適用於'Window'。你在哪裏申請這個綁定?順便說一句,你也可以在後面的代碼中直接更改UI元素的字體大小,而不使用綁定。 –

+0

是的,謝謝HighCore,我正在考慮這個問題,但我認爲將一些UI特有的東西(如FontSize和樣式等)指向一個集中式變量是值得的。 – John

+0

哦,還有「你在哪裏申請這個綁定?」我在「 John

回答

2

您可以使用RelativeSource AncestorType綁定到視圖本身的性質:

<TextBlock FontSize="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyFontSize}" /> 

使用ElementName應該工作以及:

<Window x:Name="window"> 

    <TextBlock FontSize="{Binding ElementName=window,Path=MyFontSize}" /> 
</Window> 

編輯

這裏一個我已經承認的例子堅挺的工作:

XAML

<Window x:Class="WpfAbc.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" 
    ToolTip="{Binding RelativeSource={RelativeSource Self},Path=MyToolTip}" 
    > 
    <Grid> 
     <TextBlock Text="hello world" FontSize="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyFontSize}" /> 
    </Grid> 
</Window> 

代碼隱藏

public partial class MainWindow : Window 
{ 
    private int m_fontSize = 20; 
    public int MyFontSize 
    { 
     get { return m_fontSize; } 
     set 
     { 
      if (m_fontSize != value) 
      { 
       m_fontSize = (value > 0) ? value : 10; 
      } 
     } 
    } 

    public string MyToolTip 
    { 
     get { return "hello world"; } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
} 

文章對這個話題:

相關背景:

+0

我試過這個逐字,但它沒有奏效。我將通過將「window」更改爲「NameChangeSetupMainWindow」來再次嘗試,因爲我懷疑這就是你的快捷方式的意思(我仍然很習慣綁定的語法/語義) – John

+0

嗯,也許不是......那產生了錯誤:「成員名稱不能與它們的封閉類型相同」與此語句的行號: x:Name =「NameChangeSetupMainWindow」 – John

+0

我嘗試了上述兩個示例,但都沒有成功。我嘗試在窗口中設置「工具提示」,如下所示,其中工具提示是CB文件中的公共字符串屬性,但不包括: ' <窗口 ToolTip =「{Binding RelativeSource = {RelativeSource AncestorType = Window},Path = ToolTip}「 ' – John

相關問題