Создаю на WPF диалоговое окно подобно этому:
Логика в этом окне следующая:
1. Если выбран пункт Local Computer, то отключаются (isEnabled = False) элементы:
— Поле для ввода имени компьютера
— Кнопка «Browse…»
— Чекбокс «Connect as another user:»
— Имя пользователя («<none>»)
— Кнопка «Set User…»
2. Если выбран пункт «Another computer», то включаются элементы:
— Поле для ввода имени компьютера
— Кнопка «Browse…»
— Чекбокс «Connect as another user:»
3. Если включен чекбокс «Connect as another user:», то включается кнопка «Set user»
При создании похожего диалога на Windows Forms в событии выбора пункта Local Computer у меня происходило включение/отключение других элементов интерфейса, согласно логике.
Код был примерно таким:
private void rbLocal_Checked(object sender, RoutedEventArgs e)
{
cbUserName.IsChecked = false;
}
Здесь чекбокс с именем пользователя отключался, если был выбран пункт «Local Computer».
Перейдя на WPF этот код у меня не сработал. При запуске программы и вызове этого диалога я получил сообщение об ошибке:
«NullReferenceException: Object reference not set to an instance of an object.»
В XAML-редакторе я создал все те же самые элементы и даже присвоил им некоторые начальные значения, вот только при вызове события для RadioButton rbLocal оказалось, что все остальные элементы, включая чекбокс cbUserName еще не созданы и равны null.
Пока я обошел эту ошибку, перенеся часть логики в XAML с помощью binding, а чекбокс cbUserName отключал в событии rbRemote_Unchecked, когда уже все элементы были созданы.
Пример XAML-кода с логикой отключения элементов:
<Button x:Name="btnChoose" Grid.Row="1" Content="Choose..." HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Margin="0,3,5,0" Click="btnChoose_Click" IsEnabled="{Binding ElementName=rbRemote, Path=IsChecked, UpdateSourceTrigger=PropertyChanged}"/> <CheckBox x:Name="cbUserName" Grid.Row="2" Margin="5" Content="Connect as another user:" HorizontalAlignment="Left" VerticalAlignment="Top" IsEnabled="{Binding ElementName=rbRemote, Path=IsChecked, UpdateSourceTrigger=PropertyChanged}"/> <Button x:Name="btnSetUser" Grid.Row="2" Content="Set user..." HorizontalAlignment="Right" VerticalAlignment="Top" Width="75" Margin="0,2,5,0" Click="btnSetUser_Click" IsEnabled="{Binding ElementName=cbUserName, Path=IsChecked, UpdateSourceTrigger=PropertyChanged}"/> <Label x:Name="lblUserName" Grid.Row="2" Content="<None>" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="153,0,0,0" IsEnabled="{Binding ElementName=cbUserName, Path=IsChecked, UpdateSourceTrigger=PropertyChanged}" />
- C#: Сравнить два массива - 12.12.2024
- EVE-Online: Фильтры каналов - 23.11.2024
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024