C#WPF复选框数据绑定

时间:2014-04-16 17:52:50

标签: c# wpf

我正在寻找从以下代码填充复选框的最佳方法。我已经研究过Binding,但不确定该去哪里。

以下是正在运行的已编辑代码

 private void dpDateSelection_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {

        DateTime? date = dpDateSelection.SelectedDate;
        logDate = date != null ? date.Value.ToString("yyyy-MM-dd") : null;
        dpDateSelection.ToolTip = logDate;
        LoadLogs(logDate);

    }

 private void LoadLogs(string ldate)
    {
        string[] logs = Directory.GetFiles(logPath + ldate, "*.ininlog");
        InitializeComponent();
        logList = new ObservableCollection<String>();
        logList.Clear();
        foreach (string logName in logs)
        {
            string s = logName.Substring(logName.IndexOf(ldate) + ldate.Length + 1);
            int extPos = s.LastIndexOf(".");
            s = s.Substring(0, extPos);

            logList.Add(s);
        }
        this.DataContext = this;
    }

   <ListBox x:Name="Logs" ItemsSource="{Binding logList}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <CheckBox Content="{Binding}" ToolTip="{Binding}" Tag="{Binding}"/>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

1 个答案:

答案 0 :(得分:4)

您将首先使用ItemsControl而不是StackPanel,因为ItemsControls会自动设置为显示集合:

<ItemsControl ItemsSource="{Binding Logs}"/>

请注意ItemsSource的使用。使用附带的绑定字符串,它基本上说“在DataContext上查找名为”Logs“的属性,并将其中的所有内容放入此控件中。”

接下来你说你希望它显示为复选框,所以我们使用项目模板:

<ItemsControl ItemsSource="{Binding Logs}">
   <ItemsControl.ItemTemplate>
     <DataTemplate>
        <CheckBox Content={Binding .}/>
     </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>

这表示“使用ItemsSource中每个项目的复选框”。 DataTemplate也可以是Grid或其他集合控件,因此这是WPF中非常强大的功能。 “绑定”。只是绑定到对象本身(在这种情况下是一个字符串,所以我们不需要特殊的路径)。

最后,您需要在视图模型中设置要绑定的属性:

ObservableCollection<String> Logs {get; set;}

您需要一个ObservableCollection,以便在列表中添加或删除任何内容时,它会自动更新UI。如果您要完全替换列表(赋值),则需要实现INotifyPropertyChanged并在该属性设置器中调用PropertyChanged事件。

在发布的循环中,您可以将每个日志文件添加到此属性中。

此外,请确保将XAML文件(View)的DataContext属性设置为视图模型对象。如果所有内容都在代码中,请使用DataContext = this。请注意,这样做被认为是不好的做法,您应该使用单独的类(ViewModel)。

你没有提到你想要CheckBoxes做什么,所以我没有在我的答案中包含任何与此相关的内容。您可能希望将日志抽象为具有“Selected”属性的对象,然后可以将CheckBoxes的IsChecked属性绑定到。

显然这需要参考,如果我能澄清任何内容或进一步帮助,请告诉我!

<强>更新 您将该属性放在ViewModel(DataContext)中。无论上课是什么,你都写道:

ObservableCollection<String> Logs {get; set;}

private void LoadLogs()
{
   string[] logs = Directory.GetFiles(logPath + logDate, "*.ininlog");

   foreach(string logName in logs)
   {
       string s = logName.Substring(logName.IndexOf(logDate) + logDate.Length + 1);
       int extPos = s.LastIndexOf(".");
       s = s.Substring(0, extPos);
       //MessageBox.Show(s);
       Logs.Add(s); //Add the parsed file name to the list
   }
}