2013-03-28 55 views
1

我需要为用户提供更改NLog规则日志级别的选项。选择WPF控件

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

您可以推荐使用哪种控件在WPF中提供此选项?

+0

这取决于你想如何让它看起来像?什么是 也许是一个简单的DataGrid? – 2013-03-28 07:19:08

+0

也许是一个组合框?但这一切都取决于你想要如何。 – Tan 2013-03-28 07:52:59

+0

那么这样的决定取决于各种因素。您想要展示的条目有多复杂?谁是前端的用户(技术背景)?你的用户界面的其他部分是什么样的?你有什么样的范例你必须遵循?当然,应该提供哪些功能? - 顺便说一句,我认为最好将这篇文章移到[ux.stackexchange.com](http://ux.stackexchange.com) – DHN 2013-03-28 08:16:35

回答

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元素的代码行。我所做的只是创建适当的数据结构,然后创建适当的用户界面来显示/操作它。
  • 数据和用户界面之间的“胶合”是DataContext属性,这是所有XAML绑定都解决的问题。
  • 如果你来自winforms或其他传统背景,你真的需要忘记你所知道的一切,并拥抱MVVM(点击链接它不是维基百科)。
  • 同样,我不熟悉NLog,所以我不确定我创建的数据结构是否符合您的需求。无论如何,让我知道。
  • 让我知道你是否需要进一步的帮助。我很乐意在WPF的第一步中为您提供帮助。