mutable
действительно существует, поскольку Вы выводите, чтобы позволить тому изменять данные в в других отношениях постоянной функции.
намерение состоит в том, что у Вас могла бы быть функция, которая "ничего не делает" к внутреннему состоянию объекта, и таким образом, Вы отмечаете функцию const
, но Вы, возможно, действительно должны были бы изменить часть состояния объектов способами, которые не влияют на его корректную функциональность.
ключевое слово может действовать как подсказка к компилятору - теоретический компилятор мог поместить постоянный объект (такой как глобальное) в памяти, которая была отмечена только для чтения. Присутствие mutable
подсказки, что это не должно быть сделано.
Вот некоторые допустимые причины объявить и использовать изменяемые данные:
mutable boost::mutex
совершенно разумно. Bind the Width
of the DockPanel
to the ActualWidth
of the ListBoxItem
:
<DockPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
...
Another option: you could just redefine the ItemContainerStyle
so that the ListBoxItem
is stretched horizontally:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
DockPanel
злы. Искушение использовать комбинацию StackPanel / DockPanel
для сложных макетов приводит к «тупикам в макетах». Использовать сетку:
<Grid>
<TextBlock HorizontalAlignment="Left"
...
<TextBlock HorizontalAlignment="Right"
...
/Grid>
Я использую почти исключительно сетку
, используя отдельную сетку для каждого блока элементов, которые «принадлежат друг другу»