WPF 打开文件并更新 window
WPF Opening a file and updating window
我对 WPF 比较陌生。我正在尝试打开一个 excel 文件并拉出列 headers 并将其作为检查列表显示在我的 window 中。现在我在更新 window/checklist.
时遇到问题
这是我在 xaml
中的内容
<DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<ListBox ItemsSource="{Binding TagListData}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
这是我在 cs 代码中的内容。 (而不是阅读打开的 excel 文档,我现在只是使用占位符来查看我是否正确执行此操作。)
private Excel.Application xlApp;
private Excel.Workbook xlWorkbook;
public ObservableCollection<TagClass> TagListData { get; set; }
public MainWindow()
{
InitializeComponent();
...
TagListData = new ObservableCollection<TagClass>();
}
private void btnOpenFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.slxm";
if (openFileDialog.ShowDialog() == true)
{
xlApp = new Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(openFileDialog.FileName);
//populate TagListData
TagListData.Add(new TagClass { IsTagSelected = true, TagName = "Tag Name 1" });
}
}
public class TagClass
{
public string TagName { get; set; }
public bool IsTagSelected { get; set; }
}
当我尝试打开一个文件来填充我的清单时,没有任何反应。有谁知道我做错了什么?
我还发现它会检查项目何时更新,但我想检查 list/collection 何时更新。我很难弄清楚这一点.. ListBox item doesn't get refresh in WPF?
谢谢
您似乎还没有设置 window 的 DataContext。数据上下文是您绑定的东西,它不只是自动连接绑定到您添加到 window 本身的属性。
有很多方法可以解决这个问题,最简单(但可以说是错误的)解决方法是将其添加到构造函数的末尾:
this.DataContext = this;
但这很奇怪。我建议永远不要这样做。我们通常创建一个新对象来存放我们想要绑定的数据。在这种情况下,您可以将 DataContext 设置为 TagListData,然后相应地更新绑定。
public MainWindow()
{
InitializeComponent();
...
TagListData = new ObservableCollection<TagClass>();
this.DataContext = TagListData;
}
并更新绑定
<DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<ListBox ItemsSource="{Binding}"> <!-- note no Path on this binding because the data context of the window IS the collection now -->
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
如果您要在 Window 上绑定其他内容,则将 DataContext 设置为集合将不起作用。相反,您应该创建一个新的 class 来包含该集合以及您要绑定的所有其他内容。添加此新 class 类型的 属性,并将其设置为您的 window 的 DataContext。当您使用 MVVM 模式时,这通常就是我们所说的 ViewModel。
同意尼克的观点;此外,如果您不处理 Datacontext
并使用隐藏代码,则使用 Name
属性 来识别列表框并在隐藏代码中设置 ItemsSource
。
<DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<!-- Note here-->
<ListBox Name="TagList">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
在后面的代码中
private void btnOpenFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.slxm";
if (openFileDialog.ShowDialog() == true)
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(openFileDialog.FileName);
//populate TagListData
TagListData.Add(new TagClass { IsTagSelected = true, TagName = "Tag Name 1" });
}
TagList.ItemsSource = TagListData;
}
我对 WPF 比较陌生。我正在尝试打开一个 excel 文件并拉出列 headers 并将其作为检查列表显示在我的 window 中。现在我在更新 window/checklist.
时遇到问题这是我在 xaml
中的内容 <DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<ListBox ItemsSource="{Binding TagListData}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
这是我在 cs 代码中的内容。 (而不是阅读打开的 excel 文档,我现在只是使用占位符来查看我是否正确执行此操作。)
private Excel.Application xlApp;
private Excel.Workbook xlWorkbook;
public ObservableCollection<TagClass> TagListData { get; set; }
public MainWindow()
{
InitializeComponent();
...
TagListData = new ObservableCollection<TagClass>();
}
private void btnOpenFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.slxm";
if (openFileDialog.ShowDialog() == true)
{
xlApp = new Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(openFileDialog.FileName);
//populate TagListData
TagListData.Add(new TagClass { IsTagSelected = true, TagName = "Tag Name 1" });
}
}
public class TagClass
{
public string TagName { get; set; }
public bool IsTagSelected { get; set; }
}
当我尝试打开一个文件来填充我的清单时,没有任何反应。有谁知道我做错了什么?
我还发现它会检查项目何时更新,但我想检查 list/collection 何时更新。我很难弄清楚这一点.. ListBox item doesn't get refresh in WPF?
谢谢
您似乎还没有设置 window 的 DataContext。数据上下文是您绑定的东西,它不只是自动连接绑定到您添加到 window 本身的属性。
有很多方法可以解决这个问题,最简单(但可以说是错误的)解决方法是将其添加到构造函数的末尾:
this.DataContext = this;
但这很奇怪。我建议永远不要这样做。我们通常创建一个新对象来存放我们想要绑定的数据。在这种情况下,您可以将 DataContext 设置为 TagListData,然后相应地更新绑定。
public MainWindow()
{
InitializeComponent();
...
TagListData = new ObservableCollection<TagClass>();
this.DataContext = TagListData;
}
并更新绑定
<DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<ListBox ItemsSource="{Binding}"> <!-- note no Path on this binding because the data context of the window IS the collection now -->
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
如果您要在 Window 上绑定其他内容,则将 DataContext 设置为集合将不起作用。相反,您应该创建一个新的 class 来包含该集合以及您要绑定的所有其他内容。添加此新 class 类型的 属性,并将其设置为您的 window 的 DataContext。当您使用 MVVM 模式时,这通常就是我们所说的 ViewModel。
同意尼克的观点;此外,如果您不处理 Datacontext
并使用隐藏代码,则使用 Name
属性 来识别列表框并在隐藏代码中设置 ItemsSource
。
<DockPanel Grid.Column="0" Grid.Row="1" Margin="10">
<!-- Note here-->
<ListBox Name="TagList">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsTagSelected}" Content="{Binding TagName}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</DockPanel>
在后面的代码中
private void btnOpenFile_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.slxm";
if (openFileDialog.ShowDialog() == true)
{
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlWorkbook = xlApp.Workbooks.Open(openFileDialog.FileName);
//populate TagListData
TagListData.Add(new TagClass { IsTagSelected = true, TagName = "Tag Name 1" });
}
TagList.ItemsSource = TagListData;
}