我正在寻找从以下代码填充复选框的最佳方法。我已经研究过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>
答案 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
}
}