У меня есть модель представления со списком элементов со свойством Checked.
В моем WPF XAML я создаю ListBox, каждый элемент которого имеет флажок в DataTemplate.
Также у модели представления есть свойство AllowMultiSelect. Если это правда, интерфейс должен позволять пользователю устанавливать многие флажки. Но если значение false, в интерфейсе вместо этого должны отображаться RadioButton, и пользователь должен выбрать только один.
Я попробовал необычный XAML, содержащий как CheckBox, так и RadioButton для элементов, устанавливая их Visibility на основе значения AllowMultiSelect с помощью некоторых производных свойств.
<ListBox.ItemTemplate>
<DataTemplate DataType = "{x:Type local:VMType}">
<StackPanel Orientation = "Horizontal" Margin = "0 5 0 0">
<CheckBox IsChecked = "{Binding IsChecked}"
Visibility = "{Binding Path=DataContext.ShowCheck,
ElementName=MyList,
Converter = {StaticResource BoolToVisible}}"/>
<RadioButton IsChecked = "{Binding IsChecked}" GroupName = "TableRadios"
Visibility = "{Binding Path=DataContext.ShowRadio,
ElementName=MyList,
Converter = {StaticResource BoolToVisible}}"/>
<TextBlock Text = "{Binding Text}" Margin = "5 0 0 0"/>
</StackPanel>
Но RadioButton (даже скрытый) влияет на выбор. Когда я устанавливаю флажок, свойство Checked элемента изменяется, это изменение отражается в скрытом RadioButton, а затем радио автоматически отменяет выбор других элементов.
Вопрос: есть ли способ «связать только если» свойство истинно? если AllowMultiSelect верно, я не хочу привязывать переключатели.





Это не прямой ответ на ваш вопрос, но я думаю, что полностью переключить CheckBox и RadioButton будет намного проще.
<DataTemplate>
<StackPanel Orientation = "Horizontal">
<ContentControl>
<ContentControl.Style>
<Style TargetType = "{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding = "{Binding ElementName=MyList, Path=DataContext.MultiSelect}" Value = "True">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate>
<CheckBox IsChecked = "{Binding IsChecked}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding = "{Binding ElementName=MyList, Path=DataContext.MultiSelect}" Value = "False">
<Setter Property = "Template">
<Setter.Value>
<ControlTemplate>
<RadioButton GroupName = "MyGroup" IsChecked = "{Binding IsChecked}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
<TextBlock Text = "{Binding Text}" />
</StackPanel>
</DataTemplate>
@SirRufo Спасибо за редактирование. Переключение шаблонов намного лучше.
@DanielMöller Я отредактировал ответ (он был очень близок). Вам нужно изменить
ContentControl.Template