Наиболее распространенное решение - не пытаться использовать числовое представление, из которого выбрано RadioButton
, потому что вы идете против течения, если попытаетесь.
Однако, чтобы попытаться ответить на вопрос, тем не менее...
Я не думаю, что попытался бы решить эту проблему в XAML, потому что это не играет на сильных сторонах XAML.Люди, которые относительно недавно знакомы с WPF, часто пытаются сделать все возможное в XAML, независимо от того, имеет ли это смысл или нет, потому что они откуда-то пришли к выводу, что это то, что вы должны делать.
I 'Я не говорю, что это невозможно.Чтобы ты не думал, что я пытаюсь отговорить тебя от этого, потому что я не знаю, как это сделать в XAML, я покажу точно, как я думаю, что ты не должен этого делать.Это работает для небольших значений «works»:
<UserControl
x:Class="MyNamespace.CommandControl"
xmlns:loc="clr-namespace:MyNamespace"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="65" d:DesignWidth="219"
x:Name="me">
<StackPanel HorizontalAlignment="Left" Name="stackPanel1" VerticalAlignment="Center" Orientation="Horizontal">
<RadioButton Content="Disable" Name="disableRadio" VerticalAlignment="Center" IsChecked="True" />
<RadioButton Content="Enable" Name="enableRadio" VerticalAlignment="Center" Margin="5,0,0,0" />
<RadioButton Content="Configure" Name="configureRadio" VerticalAlignment="Center" Margin="5,0,0,0" />
</StackPanel>
<UserControl.Style>
<Style TargetType="loc:MyNamespace">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=disableRadio, Path=IsChecked}" Value="True">
<DataTrigger.Setters>
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=enableRadio, Path=IsChecked}" Value="True">
<DataTrigger.Setters>
<Setter Property="SelectedIndex" Value="1" />
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=configureRadio, Path=IsChecked}" Value="True">
<DataTrigger.Setters>
<Setter Property="SelectedIndex" Value="2" />
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Style>
</UserControl>
, но это довольно странно.Прежде всего, Visual Studio сделает вид, что есть ошибка - если у вас открыт этот Xaml-файл, он будет сообщать об ошибке «CommandControl» TargetType не соответствует типу элемента «UserControl».Во-вторых, это работает, только если вы поставите Style
после основной части пользовательского элемента управления.Честно говоря, такого рода проблемы являются запахами кода - подсказка о том, что вы, возможно, делаете что-то не так.И в этом случае вы бы.
Кстати, Visaul Studio не говорит правду с сообщением об ошибке - это не ошибка времени компиляции, и программа будет собираться и запускаться, и с использованием следующегосодержимое основного окна:
<Grid>
<my:CommandControl HorizontalAlignment="Left" Margin="224,114,0,0" x:Name="commandControl1" VerticalAlignment="Top" />
<TextBlock Height="82" HorizontalAlignment="Left" Margin="76,162,0,0" Name="textBlock1" Text="{Binding ElementName=commandControl1, Path=SelectedIndex}" VerticalAlignment="Top" Width="237" />
</Grid>
Я убедился, что это правильно обновляет свойство.
Но это все неправильно.
С одной стороны, что вы 'Вы пытаетесь создать здесь программную функциональность - вы определяете, как ведет себя API-интерфейс элемента управления.Это далеко за пределами сильных сторон XAML.Черт, даже встраивание интерактивного поведения в XAML сомнительно.Я считаю, что XAML в основном предназначен для макета и внешнего вида вашего приложения.
Так что кодовый код - это действительно место для того, что вы делаете.Просто используйте хорошую старомодную обработку событий.Обязательно используйте SetCurrentValue
, чтобы обновить значение свойства зависимостей.Не просто используйте сеттер, потому что это испортит любые привязки данных или другое специфическое для DP использование вашего свойства и, по существу, лишит смысла превращать его в DP.
Кроме того,Я бы не назвал это SelectedIndex
, потому что это имя свойства, которое обычно означает что-то конкретное в WPF - оно в основном используется производными от ItemsControl элементами управления, которые поддерживают выбор.Это не то, что вы делаете здесь, поэтому я бы предпочел выбрать имя, которое обычно не имеет смысла.За исключением того, что я уже сказал, я не думаю, что я бы использовал числовой индекс в любом случае.