2014-01-23 3 views
0

Я начинаю работать в wpf, и я хочу помочь с этим фрагментом кода XAML.«Каскад» Databinding

<DataGrid ItemsSource="{Binding Elements[person]}" > 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="headerPhone" Binding="{Binding Element[phone].Value}"> 
      <DataGridTextColumn.CellStyle> 
       <Style TargetType="{x:Type DataGridCell}" x:Name="headerPhoneCStyle"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Element[phone].Attribute[changed].Value}" Value="yes"> 
         <Setter Property="Background" Value="Red"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGridTextColumn.CellStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Есть ли какой-то способ, как уменьшить это:

Binding="{Binding Element[phone].Attribute[changed].Value}" 

Чтобы просто что-то вроде этого:

Binding="{Binding Attribute[changed].Value}" 
+0

'Binding =" {Атрибут привязки [изменен] .Value} «Это не работает? – Sankarann

ответ

0

Для этого вам необходимо будет изменить DataContext пунктов. В настоящее время ваше имущество DataGrid.ItemsSource - это данные, привязанные к объекту Elements[person] ... это должно быть быть коллекцией какого-либо типа, и поэтому DataContext каждого элемента имеет значение элемент из этой коллекции.

Трудно сказать точную структуру вашего класса данных, потому что вы не показали нам [you should always show all the relevant code], но если вашим Binding работы, то кажется, что каждый элемент имеет индексное свойство с именем Element в нем. Теперь, если вы хотите, чтобы данные связываются непосредственно с объектом, который возвращается при использовании индекса phone, вы можете просто добавить, что в ItemsSource Binding вместо:

<DataGrid ItemsSource="{Binding Elements[person].Element[phone]}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="headerPhone" Binding="{Binding Value}"> 
      <DataGridTextColumn.CellStyle> 
       <Style TargetType="{x:Type DataGridCell}" x:Name="headerPhoneCStyle"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Attribute[changed].Value}" 
          Value="yes"> 
          <Setter Property="Background" Value="Red" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </DataGridTextColumn.CellStyle> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Однако, если Elements[person].Element[phone] является не коллекция, есть не так много смысла в использовании DataGrid, чтобы отобразить его ... если он является коллекцией, то это должно работает просто отлично. Дайте мне знать, как вы поживаете. Кроме того, вы должны увидеть Property Path Syntax и Binding.Path Property страниц в MSDN для получения дополнительной справки по синтаксису Binding.Path.