选择WPF控件

时间:2013-03-28 07:16:46

标签: wpf wpf-controls

我需要为用户提供更改NLog规则的日志记录级别的选项。

有12条规则,每条规则都有自己的日志记录级别。

您建议使用哪些控件在WPF中提供此选项?

1 个答案:

答案 0 :(得分:1)

我不熟悉NLog,但我想如果你必须在少量预先确定的选项之间进行选择,那么ComboBox就是最好的UI元素。

你说你有12个日志级别,所以在这种情况下,使用ItemsControl来实际显示这些项目而不是自己创建所有UI元素是最有意义的:

<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>

代码背后:

    public partial class LogLevelsSample : Window
    {
        public LogLevelsSample()
        {
            InitializeComponent();

            DataContext = new LogSettingsViewModel();
        }
    }

视图模型:

    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
    }

结果:

enter image description here

注意事项:

  • 我看到你有几个未回复的WPF问题,你看起来很沮丧。不要。这是一个美丽而优秀的框架。我创建了这个例子,希望你能看到它真正的美丽。如果没有更多的代码和努力,你就无法在winforms中实现同样的例子。
  • 看看这段代码实际上是多么简单和漂亮。我正在广泛使用WPF的数据绑定功能,这使得一切都变得更容易。
  • 请注意,没有一行代码可以引用或操作任何UI元素。我所做的就是创建正确的数据结构,然后创建适当的UI来显示/操作它。
  • 数据和UI之间的“粘合剂”是DataContext属性,这是解析所有XAML绑定的原因。
  • 如果你来自winforms或其他传统背景,你真的需要忘记你所知道的一切并拥抱MVVM(点击链接它不是维基百科)。
  • 同样,我不熟悉NLog所以我不确定我创建的数据结构是否符合您的需要。无论如何,请告诉我。
  • 如果您需要进一步的帮助,请与我们联系。我很乐意在WPF的第一步帮助你。