2010-05-27 68 views
2

裏面我有數據模板如下里面用不了的TextBlock:如何訪問控制存在一個DataTemplate

<DataTemplate> 
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal"> 
     <TextBlock x:Name="myTextBox" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="14" /> 
    </StackPanel> 
    </DataTemplate> 

現在,我們需要使myTextBox Collsapsed在某些情況下,但不想使用的加載或點擊事件,然後通過sender訪問控制。

我可以使用任何其他方法或方法嗎?

感謝,

Subhen

+0

什麼情景? – slugster 2010-05-27 11:39:48

+0

@ Slugster,我在數據模板中有4個不同的文本框,我想從不同的按鈕點擊交換Visibiliti選項。 – Simsons 2010-05-27 12:21:39

+1

你的問題是沒有道理的。要使名爲myTextBox的文本塊摺疊,只需將其可見性屬性更改爲摺疊狀態。自從您爲其命名以來,您有一個參考。這可以在代碼後面的任何地方完成。 – 2010-05-27 16:04:49

回答

2

不幸的是,有辦法做到這一點那麼簡單,訪問指定的對象。假設你使用綁定來填充這個數據模板,一個選項是遍歷父控件的子對象,並根據已知值檢查文本字段。稍微乾淨一些的可能是使用Tag屬性(可以綁定到任何對象)並通過這種方式進行比較。

另一種選擇(我最常用的這種方法)是將屬性添加到綁定的對象並將該屬性綁定到可見性(如果需要,使用轉換器)。例如,如果你目前正在綁定到一個ObservableCollection <字符串>,更改綁定到一個ObservableCollection < StringWithVisibility>其中StringWithVisibility樣子:

public class StringWithVisibility 
{ 
    public string Text {get; set;} 
    public bool IsVisible {get; set;} 
} 

然後你的模板是這樣的:

<DataTemplate> 
    <StackPanel x:Name="stackPanelItems" Orientation="Horizontal"> 
     <TextBlock Text="{Binding Text}" Visibility={Binding IsVisible, Converter={StaticResource BoolVisibilityConverter}} /> 
    </StackPanel> 
</DataTemplate> 

並且您已經創建了相應的IValueConverter作爲資源。如果你不熟悉的轉換器,該文檔是在這裏:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter(VS.95).aspx

1

轉換器是最好的方法,但要回答你的問題,你可以訪問背後的控制這種方式,在代碼:

TextBox myTextbox = GetTemplateChild("myTextbox") as Textbox; 
if (myTextbox != null) 
{ 
    // do something 
} 
+0

對不起,說!但是,這並不工作.. – 2013-05-24 05:23:49

+0

你能回答這個:http://stackoverflow.com/questions/16727854/how-to-find-a-control-that-is-inside-datatemplate-assign - 值合WPF/16728718?noredirect = 1#16728718 – 2013-05-24 06:39:57

相關問題