2013-12-23 3 views
0

Я хочу, чтобы моя сетка была отключена, когда мое свойство имеет значение Null и включено, когда оно равно null.WPF IsEnabled Grid

В моей .xaml:

<Grid Grid.Row="2" IsEnabled="{Binding ElementName=dgCustomers, Path=SelectedItem}"> 
     <my:ProductsHistoryDetailView /> 
    </Grid> 

В моем ViewModel.cs:

public ProductHistory SelectedItem 
    { 
     get { return _SelectedItem; } 
     set 
     { 
      if (_SelectedItem != value) 
      { 
       _SelectedItem = value; 
       RaisePropertyChanged(() => SelectedItem); 
      } 
     } 
    } 

ответ

4

Вы должны добавить дополнительное свойство к вашему ViewModel.

public bool IsGridEnabled 
    { 
     get 
      { 
      return this.SelectedItem != null; 
      } 
    } 

<Grid Grid.Row="2" IsEnabled="{Binding IsGridEnabled}"> 
    <my:ProductsHistoryDetailView /> 
</Grid> 

И когда ваши SelectedItem изменений, вызовите OnPropertyChanged события для IsGridEnabled:

public ProductHistory SelectedItem 
{ 
    get { return _SelectedItem; } 
    set 
    { 
     if (_SelectedItem != value) 
     { 
      _SelectedItem = value; 
      RaisePropertyChanged(() => SelectedItem); 
      RaisePropertyChanged(() => IsGridEnabled); 
     } 
    } 
} 
+0

Большое вам спасибо! –

+0

Nit: EnableGrid звучит скорее как имя метода, чем имя свойства. Может ли GridEnabled быть более подходящим? – Mike

+0

@Mike Да, вы правы. Я изменю его. – Loetn

1

Пожалуйста, убедитесь, что ваш selectebitem имеет действительное значение, как это:

<Grid Grid.Row="2" IsEnabled="{Binding ElementName=dgCustomers, Path=SelectedItem.Value}"> 
     <my:ProductsHistoryDetailView /> 
    </Grid> 
2

Вы могли бы использовать IValueConverter:

<Grid Grid.Row="2" IsEnabled="{Binding 
    ElementName=dgCustomers, Path=SelectedItem, 
    Converter={StaticResource NullToFalseConverter}"> 

public class NullToFalseConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value == null ? false : true; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

С другой стороны, это может быть проще добавить еще одно свойство IsSelected к вашей модели представления, которые можно связать непосредственно IsEnabled:

public bool IsSelected 
{ 
    get { return _isSelected; } 
    set 
    { 
     if (_isSelected != value) 
     { 
      _isSelected = value; 
      RaisePropertyChanged(() => IsSelected); 
     } 
    } 
} 

public ProductHistory SelectedItem 
{ 
    get { return _SelectedItem; } 
    set 
    { 
     if (_SelectedItem != value) 
     { 
      _SelectedItem = value; 
      RaisePropertyChanged(() => SelectedItem); 
     } 
     IsSelected = value != null; 
    } 
} 
+0

Спасибо вы так много! –

3

использовать стиль триггер для изменения Enabled Свойства вместо того, чтобы связать его непосредственно

<Grid Grid.Row="2"> 
    <Grid.Style> 
     <Style TargetType="Grid"> 
      <Setter Property="IsEnabled" Value="True"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=dgCustomers, Path=SelectedItem"}" Value={x:Null}> 
        <Setter Property="IsEnabled" Value="False"/> 
       </DataTrigger> 
      </Style.Triggers>    
     </Style> 
    </Grid.Style> 
</Grid> 
+0

Большое вам спасибо! –

+0

Спасибо, возможно, лучшее решение, если вы не можете или не хотите изменять ViewModel. –

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