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

+0

@ Slugster, у меня есть 4 разных текстовых поля внутри шаблона данных, и я хочу поменять параметр Visibiliti на различные клики по кнопкам. – Simsons

+1

Ваш вопрос как есть, не имеет смысла. Чтобы сделать текстовый блок с именем myTextBox рухнул, просто измените его свойство видимости, которое рухнуло. У вас есть ссылка на него, так как вы его назвали. Это можно сделать в коде позади, где бы вы ни захотели это сделать. –

ответ

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

Извините, но это не работает. –

+0

Можете ли вы ответить на это: http://stackoverflow.com/questions/16727854/how-to-find-a-control-that-is-inside-datatemplate-assign -value-в-Wpf/16728718? noredirect = 1 # 16728718 –

Смежные вопросы