2016-04-07 9 views
0

У меня есть привязка, которая не работает, а не фиксирует ее единственным способом, которым я знаю, как бы я хотел лучше понять, почему он не работает и какие параметры у меня есть, кроме одного решения, которое я знаю ,WPF CheckBox IsChecked Binding Issue

XAML:

<CheckBox Grid.Row="6" Grid.Column="1" IsChecked="{Binding Path=CurSerialPort.ExpansionEnabled}" Margin="7" VerticalAlignment="Stretch" ToolTip="Select whether DHCP is enabled."> 
    <CheckBox.Style> 
     <Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=CurSerialPort.ShowExpansionEnable}" Value="False"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </CheckBox.Style> 

Связывание вопроса:

IsChecked="{Binding Path=CurSerialPort.ExpansionEnabled}" 

DataContext:

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.DataContext = main.Model; 
} 

main.Model включает:

/// <summary> 
/// The currently selected serial port 
/// </summary> 
public SerialModel CurSerialPort 
{ 
    get { return this.curSerialPort; } 
    set 
    { 
     if (value != null) 
     { 
     this.curSerialPort = value; 
     } 

     RaisePropertyChanged("CurSerialPort"); 
    } 
} 

SerialModel включает в себя:

/// <summary> 
/// Expansion Enable 
/// </summary> 
public bool ExpansionEnable 
{ 
    get 
    { 
     return this.expansionEnable; 
    } 
    set 
    { 
     this.expansionEnable = value; 
    } 
} 

Будучи связаны, как это не работает. Набор и получение ExpansionEnable не отражают флажок на странице.

Я знаю, что я мог бы просто добавить:

public bool CurSerialPortExpansionEnable 
{ 
    get { return CurSerialPort.ExpansionEnable; } 
    set { CurSerialPort.ExpansionEnable = value; } 
} 

Для модели и привязка будет работать, потому что это, как это было сделано со свойствами, связанных с основной моделью в целом, хотя я не хочу должны продолжать добавлять отдельные свойства, подобные этому для каждого объекта, у которого есть несколько экземпляров, и действительно хотели бы найти решение, в котором привязка будет такой, как указано выше.

IsChecked="{Binding Path=CurSerialPort.ExpansionEnabled}" 

Редактировать: Не уверен, что я изменил, но на самом деле это полностью работает. Ответ ниже указал на недостаток, когда я забыл RaisePropertyChanged, но кроме этого все кажется хорошим сейчас.

+0

Define не работает. Являются ли даже set set? – Paparazzi

ответ

2

Define не работает. Являются ли даже set set?

Попробуйте добавить NotifyPropertyChanged к SerialModel

public bool ExpansionEnable 
{ 
    get 
    { 
     return this.expansionEnable; 
    } 
    set 
    { 
     if(this.expansionEnable == value) return; 
     this.expansionEnable = value; 
     RaisePropertyChanged("ExpansionEnable"); 
    } 
} 

Если выше не работает, то вынимают стиль и посмотреть, если что-то ломается.
Но это выглядит хорошо для меня.

+0

Не работая, он не попал в игру. Хороший момент, не могу поверить, что я забыл RaisePropertyChecked .... Хотя его работа сейчас случайным образом. Наборы и розыгрыши ломаются. Я серьезно не знаю, что изменилось, но по какой-то причине я рад, что его работа теперь стала причиной моей жизни. Я не понимал, почему. – Birdbuster