2017-01-20 2 views
0

Как связать Visibility элемента Grid с двумя элементами Checkbox. Я хочу, чтобы сетка отображалась, если хотя бы один из них отмечен. Я не хочу использовать преобразователи.Как связать с 2 элементами в WPF

Вот что у меня есть:

/// <summary> 
    /// Identifies whether the tags will be copied from source to target host 
    /// </summary> 
    private bool pasteTags = true; 
    public bool PasteTags 
    { 
    get { return pasteTags; } 
    set 
    { 
     pasteTags = value; 
     RaisePropertyChanged("PasteTags"); 
    } 
    } 


    /// <summary> 
    /// Identifies whether the dimensions will be copied from source to target host 
    /// </summary> 
    private bool pasteDimensions = true; 
    public bool PasteDimensions 
    { 
    get { return pasteDimensions; } 
    set 
    { 
     pasteDimensions = value; 
     RaisePropertyChanged("PasteDimensions"); 
    } 
    } 


    /// <summary> 
    /// Identifies if the views data grid is displayed or not. 
    /// </summary>  
    public System.Windows.Visibility IsViewGridVisible 
    { 
    get 
    { 
     if (pasteDimensions || pasteTags) 
      return System.Windows.Visibility.Visible; 

     return System.Windows.Visibility.Collapsed; 
    } 
    } 

XAML:

<Grid Visibility="{Binding IsViewGridVisible}"> </Grid> 

ответ

1

Единственное, что вам нужно, это вызов RaisePropertyChanged("IsViewGridVisible"); в обоих инкубационных свойств PasteDimensions и PasteTags.

public bool PasteDimensions 
    { 
    get { return pasteDimensions; } 
    set 
    { 
     pasteDimensions = value; 
     RaisePropertyChanged("PasteDimensions"); 
     RaisePropertyChanged("IsViewGridVisible"); 
    } 
    } 

Это необходимо потому, что вы IsViewGridVisible зависит от обоих значений этих свойств и WPF должен быть проинформирован об изменении (он не может понять его любым другим способом).

+0

Но потом он все равно будет поднимать, если оба не остановить! – Vahid

+2

@Vahid да, и вы хотите, чтобы скрыть сетку. Если оба они не отмечены, ваш 'IsViewGridVisible' будет извлекать' Collapsed' - он изменился. – Rafal

+0

Спасибо. Я понял! – Vahid

1

На самом деле вам не нужно IsViewGridVisible.

Вместо этого, вы можете определить стиль, который устанавливает Visibility сетке путем в MultiDataTrigger на PasteTags и PasteDimensions свойства:

<Grid> 
    <Grid.Style> 
     <Style TargetType="Grid"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding PasteTags}" Value="True"/> 
         <Condition Binding="{Binding PasteDimensions}" Value="True"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Visibility" Value="Visible"/> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Style> 
</Grid> 
+0

Спасибо Клеменс. Это также хорошее и гениальное решение. – Vahid

+1

Разница в том, что она реализует логику в представлении, в то время как другой подход реализует логику в модели представления. Это решение для разработки программного обеспечения. – Clemens

+0

Если это чисто связанный с просмотром аспект, вы можете даже отбросить свойства PasteTags и PasteDimensions из своей модели представления и напрямую привязать к свойствам IsChecked двух CheckBoxes. – Clemens

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