2016-10-19 2 views
0

Я относительно новый в WPF, мой XAML-файл еще более сложный и запутанный, потому что некоторый код часто повторяется. Есть ли какой-нибудь простой способ сделать код лучше и короче? Например, у меня есть DataGrid, где DataGridColumnTemplate всегда одинаковый, и только его источник данных и имя заголовка разные.Как избежать повторения стилей в WPF

<DataGridTemplateColumn Header="Web"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="auto" /> 
           <ColumnDefinition Width="auto" /> 
          </Grid.ColumnDefinitions> 
          <CheckBox Grid.Column="0" Margin="4,0" IsChecked="{Binding Webs.IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
           <CheckBox.Style> 
            <Style TargetType="CheckBox"> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding Webs}" Value="{x:Null}"> 
               <Setter Property="IsEnabled" Value="false"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </CheckBox.Style> 
          </CheckBox> 
          <Button Grid.Column="1" Content="Detail" Margin="3,1" /> 
         </Grid> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

      <DataGridTemplateColumn Header="Flange"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="auto" /> 
           <ColumnDefinition Width="auto" /> 
          </Grid.ColumnDefinitions> 
          <CheckBox Grid.Column="0" Margin="4,0" IsChecked="{Binding Flanges.IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
           <CheckBox.Style> 
            <Style TargetType="CheckBox"> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding Flanges}" Value="{x:Null}"> 
               <Setter Property="IsEnabled" Value="false"></Setter> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </CheckBox.Style> 
          </CheckBox> 
          <Button Grid.Column="1" Content="Detail" Margin="3,1" /> 
         </Grid> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
+0

Best вы можете сделать здесь перенести ваш '' DataTemplate' в CellTemplate' к 'Resources'. – AnjumSKhan

ответ

0

в вашей конкретной ситуации, когда null значение следует отключить контроль, есть грубый хак, чтобы связать IsEnabled непосредственно и полагаться на TargetNullValue заменить null s

<CheckBox Grid.Column="0" Margin="4,0" 
      IsChecked="{Binding Flanges.IsSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
      IsEnabled="{Binding Path=Flanges, TargetNullValue=false}"/> 

однако это производит некоторые обязательные ошибки при свойство не является нулевым

Значение, выраженное BindingExpression, недействительно для целевого свойства. target element is CheckBox; target property is IsEna bled '(тип «Boolean») «

Для проверки null он имеет специальную ценность для проверки и использует его в привязке. это гораздо короче, чем писать DataTrigger

IsEnabled="{Binding Path=Flanges, Converter={StaticResource IsNullConverter}}" 

смотри также связанный с этим вопрос: Null To Boolean IValueConverter not working

0

Определение стилей является распространенным методом, чтобы сократить свой код и повторное использование стилей неоднократно.
Вы можете следить за ссылками ниже, чтобы узнать о WPF Стили:
Using WPF styles
Styling and Templating
Walkthrough: Styling WPF Content

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