2013-12-23 47 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

你應該額外的屬性添加到您的視圖模型。

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

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

當你的SelectedItem變化,呼籲IsGridEnabled的OnPropertyChanged事件:

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

謝謝綁定它Enabled屬性你真是太棒了! –

3

使用樣式觸發改變,而不是試圖直接

<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,可能是最好的解決方案。 –