Я не знаком с NLog, но я думаю, если вы должны выбрать между небольшим количеством заранее определенных параметров, то ComboBox
- лучший элемент пользовательского интерфейса для этого.
Вы сказали, что у вас есть 12 Вход уровней, поэтому в этом случае имеет наибольший смысл использовать ItemsControl
на самом деле показать эти элементы вместо создания всех элементов пользовательского интерфейса самостоятельно:
<Window x:Class="MiscSamples.LogLevelsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="LogLevels" Height="300" Width="300">
<ItemsControl ItemsSource="{Binding LogRules}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Width="100" Margin="2" Text="{Binding Name}"/>
<ComboBox ItemsSource="{Binding DataContext.LogLevels, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItem="{Binding LogLevel}" Width="100" Margin="2"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
Код Behind:
public partial class LogLevelsSample : Window
{
public LogLevelsSample()
{
InitializeComponent();
DataContext = new LogSettingsViewModel();
}
}
ViewModel:
public class LogSettingsViewModel
{
public List<LogLevels> LogLevels { get; set; }
public List<LogRule> LogRules { get; set; }
public LogSettingsViewModel()
{
LogLevels = Enum.GetValues(typeof (LogLevels)).OfType<LogLevels>().ToList();
LogRules = Enumerable.Range(1, 12).Select(x => new LogRule()
{
Name = "Log Rule " + x.ToString(),
LogLevel = MiscSamples.LogLevels.Debug
}).ToList();
}
}
Элементы данных:
public class LogRule
{
public string Name { get; set; }
public LogLevels LogLevel { get; set; }
}
public enum LogLevels
{
Trace,
Debug,
Warn,
Info,
Error,
Fatal
}
Результат:
Things отметить:
- Я вижу, у вас есть несколько вопросов без ответа WPF и вы выглядите довольно расстроенным об этом. Не будь. Это прекрасная и отличная среда для работы. Я создал этот пример в надежде, что вы сможете увидеть его истинную красоту. Нет никакого шанса, что вы можете достичь такого же примера в winforms без LOT больше кода и усилий.
- Посмотрите, насколько простым и красивым этот код на самом деле. Я широко использую возможности привязки данных WPF, и это делает все намного проще.
- Обратите внимание, что не существует ни одной строки кода, которая ссылается или управляет каким-либо элементом пользовательского интерфейса. Все, что я сделал, это создать правильные структуры данных, а затем создать соответствующий пользовательский интерфейс, чтобы отображать/манипулировать им.
- «Клей» между данными и пользовательским интерфейсом - это свойство
DataContext
, что и устраняет все привязки XAML.
- Если вы пришли из winforms или других традиционных фонов, вам действительно нужно забыть все, что вы знаете, и обнять MVVM (Нажмите на ссылку, это не википедия).
- Опять же, я не знаком с NLog, поэтому я не уверен, соответствует ли структура данных, которую я создал, что вам нужно. В любом случае, дайте мне знать.
- Сообщите мне, если вам нужна дополнительная помощь. Я буду рад помочь вам в ваших первых шагах в WPF.
Это зависит от того, как вы хотите, чтобы это выглядело так? Что такое Возможно, простой DataGrid? –
Может быть, combobox? Но все зависит от того, как вы этого хотите. – Tan
Ну, такое решение зависит от разных факторов. Насколько сложна запись, которую вы хотите показать? Кто является пользователем интерфейса (технический фон)? Как выглядит ваш пользовательский интерфейс? Есть ли какие-то парадигмы, которым вы должны следовать? И, конечно, какая функциональность должна быть обеспечена?- Кстати, я думаю, что лучше переместить этот пост на [ux.stackexchange.com] (http://ux.stackexchange.com) – DHN