2012-06-15 5 views
1

В моем файле XAML, у меня есть:связывание элемента внутри DataTemplate

<DataTemplate DataType="{x:Type Configuration:Drivers}"> 
    <ItemsControl ItemsSource="{Binding Cars}" FontWeight="Normal" /> 
<DataTemplate> 

<DataTemplate DataType="{x:Type Configuration:Car}"> 
    <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2">            
     <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/>  
     <CheckBox Visibility="{Binding SaveImage, UpdateSourceTrigger=PropertyChanged}"/> 
    </UniformGrid>  
</DataTemplate> 

Для каждого автомобиля, это: Enabled собственности, но не имеет SaveImage свойства.

Car 
{ 
    public bool Enabled {} 
} 

«SaveImage» установлен во всем мире. Я не знаю, как связать это: bool SaveImage внутри DataTemplate?

Я надеюсь, что этот вопрос ясен. Заранее спасибо.

ответ

1

DataTemplates - это граница инкапсуляции, поэтому вы не можете использовать FindAncestor для получения требуемых данных. Хорошим решением является положить ViewModel в вашем XAML как StaticResource, а затем установить DataContext вас LayoutRoot сетки к этому StaticResource, то все остальные DataTemplates могут получить доступ к DataContext через тот же StaticResource

Пример

<Window.Resources> 
    <local:MyViewModel x:Key="viewmodel" /> 
    <DataTemplate DataType="{x:Type Configuration:Car}"> 
     <UniformGrid HorizontalAlignment="Stretch" Margin="5,1,5,2" Columns="2"> 
      <CheckBox IsChecked="{Binding Enabled, UpdateSourceTrigger=PropertyChanged}"/> 
      <CheckBox Visibility="{Binding Source={StaticResource viewmodel}, 
       Path=SaveImage, UpdateSourceTrigger=PropertyChanged}"/> 
     </UniformGrid> 
    </DataTemplate> 
</Window.Resources> 
<Grid DataContext="{Binding Source={StaticResource viewmodel}}"> 

</Grid> 
+0

не могли бы вы привести пример? – olidev

+0

Я почти там. Большое спасибо. Однако, когда свойство: SaveImage в MyViewModel изменено на Visibility.Visible по умолчанию: Hidden, видимость CheckBox не изменяется. Я даже установил: Mode = TwoWay в привязке. Есть идеи? Заранее благодарю – olidev

+0

Убедитесь, что ваша модель просмотра реализует INotifyPropertyChanged и запускает правильные уведомления –

0

Если SaveImage доступен в DataContext из ItemsControl вы можете привязать к нему так:

<CheckBox IsChecked="{Binding DataContext.SaveImage, UpdateSourceTrigger=PropertyChanged, 
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}"/> 
+0

Thank. но у меня возникла эта проблема: System.Windows.Data Error: 40: Ошибка пути BindingExpression: свойство SaveImage не найдено на 'объекте' '' Драйверы '(HashCode = 31049803)'. BindingExpression: Path = DataContext.SaveImage; DataItem = 'ItemsControl' (Name = ''); целевой элемент - «CheckBox» (Name = ''); target свойство «Видимость» (тип «Видимость») – olidev

+0

Я обновил свой вопрос. Как получить родительский элемент DataContext. Я имею в виду один верхний уровень драйверов, тогда я могу получить свойство «SaveImage» – olidev

+0

. Вам нужно добраться до UserControl, чей DataContext является родителем драйверов. Это будет тот, который вы использовали бы как AncestorType. – MatthiasG

0

Решение 1: Вы можете попробовать RelativeSource для привязки IsCheck к объекту abcestor.

{Binding Path=SaveImage, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}} 

Решение 2: Добавить свойство SaveImage для просмотра-модели класса автомобиля и реф модели SaveImage.It не является хорошим решением.

+0

, поэтому мне нужно создать новый класс: typeOfAncestor? Я действительно не понимаю об этом. Для решения 2 легко решить проблему, но для ограничения конструкции мы не можем ввести ее для каждого автомобиля. – olidev

+0

для решения 1, я получил это: System.Windows.Data Error: 4: Не могу найти источник для привязки со ссылкой «RelativeSource FindAncestor, AncestorType =« Config.MultipleCheck », AncestorLevel = '1' '.BindingExpression: Path = SaveImage; DataItem = NULL; целевым элементом является «TextBlock» (Name = ''); target свойство - «Видимость» (тип «Видимость») – olidev

+0

public class MultipleCheck { Видимость _SaveImage = Visibility.Hidden; public Visibility SaveImage { get {return _SaveImage; } set {_SaveImage = значение; } } } – olidev

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