2017-08-01 97 views
1

我一直在搜索这个,所以我没有找到正在做我想要的东西。下面附加的截图是我想创建的,这是在VBA中完成的,但我正尝试使用WPF在C#中创建它。 我正在导入具有以下结构的CSV文件: “ID”,“NAME”,CheckedINT

“1662”,“BØRSTER”,1 < - 1 =检查,0 =未检查。C#WPF在列表视图中为每个项目创建复选框

因此,当我导入一个文件时,它在列表视图中显示信息。但是,我无法设置为每个项目/记录创建该复选框。我试图在XAML文件中创建它。
如果您需要一些代码,例如将数据加载到列表视图中,让我知道。 我对C#相当陌生,所以深入解释会非常感激(使用VS15)。

Image

XAML:

<Window x:Class="CloneMacro.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:CloneMacro" 
     mc:Ignorable="d" 
     Title="Clone Macro" Height="350" Width="592.045" Closed="MainWindow_Closed" Icon="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\copy.png"> 
    <Grid Background="#FFDEDEDE" Margin="-1,0,1,0"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="71*"/> 
      <ColumnDefinition Width="399*"/> 
      <ColumnDefinition Width="114*"/> 
     </Grid.ColumnDefinitions> 
     <Button x:Name="cmdNew" HorizontalAlignment="Left" Margin="39,36,0,0" VerticalAlignment="Top" Width="39" Height="40" ToolTip="New" Grid.ColumnSpan="2" Click="cmdNew_Click"> 
      <Image x:Name="imgNew" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="36" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\Generic_Document.png" RenderTransformOrigin="0.172,1.089"/> 
     </Button> 
     <Button x:Name="cmdOpen" HorizontalAlignment="Left" Margin="8,36,0,0" VerticalAlignment="Top" Width="39" Height="40" ToolTip="Open" Grid.Column="1" Click="cmdOpen_Click"> 
      <Image x:Name="imgOpen" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="36" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\folder_Open_32xLG.png"/> 
     </Button> 
     <Button x:Name="cmdSave" HorizontalAlignment="Left" Margin="48,36,0,0" VerticalAlignment="Top" Width="39" Height="40" ToolTip="Save" Grid.Column="1" Click="cmdSave_Click"> 
      <Image x:Name="imgSave" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="36" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\save_16xLG.png"/> 
     </Button> 
     <Button x:Name="cmdDelete" HorizontalAlignment="Left" Margin="139,36,0,0" VerticalAlignment="Top" Width="39" Height="40" Grid.Column="1" Click="cmdDelete_Click"> 
      <Image x:Name="imgDelete" HorizontalAlignment="Left" Height="33" VerticalAlignment="Top" Width="32" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\action_Cancel_16xLG.png" ToolTip="Delete" RenderTransformOrigin="1.334,0.534"/> 
     </Button> 
     <Button x:Name="cmdNewStore" HorizontalAlignment="Left" Margin="179,36,0,0" VerticalAlignment="Top" Width="39" Height="40" Grid.Column="1" Click="cmdNewStore_Click"> 
      <Image x:Name="imgNewStore" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="36" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\action_add_16xLG.png" ToolTip="Add New Store" RenderTransformOrigin="0.5,0.5"/> 
     </Button> 
     <Button x:Name="cmdExecute" HorizontalAlignment="Left" Margin="259,36,0,0" VerticalAlignment="Top" Width="39" Height="40" ToolTip="Execute" Grid.Column="1" Click="cmdExecute_Click"> 
      <Image x:Name="image" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="37" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\StatusAnnotations_Play_32xLG_color.png"/> 
     </Button> 
     <Button x:Name="cmdCancel" HorizontalAlignment="Left" Margin="299,36,0,0" VerticalAlignment="Top" Width="39" Height="40" ToolTip="Cancel" Grid.Column="1" Click="cmdCancel_Click"> 
      <Image x:Name="imgCancel" HorizontalAlignment="Left" Height="37" VerticalAlignment="Top" Width="36" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\CancelApproval_32x32.png"/> 
     </Button> 
     <CheckBox x:Name="chOpenLastUsed" Content="Open Last Used File" Margin="360,48,0,0" VerticalAlignment="Top" Height="21" Width="147" HorizontalAlignment="Left" Grid.Column="1" Grid.ColumnSpan="2"/> 
     <ListView x:Name="lvStores" HorizontalAlignment="Left" Height="161" Margin="39,98,0,0" VerticalAlignment="Top" Width="370" Grid.ColumnSpan="2"> 
      <ListView.View> 
       <GridView> 
        <GridView.Columns> 
         <GridViewColumn Header="ID" Width="50"> 
          <GridViewColumn.CellTemplate> 
           <DataTemplate> 
           <CheckBox Content="{Binding sID}" IsChecked="{Binding IsChecked}"/> 
           </DataTemplate> 
          </GridViewColumn.CellTemplate> 
          </GridViewColumn> 
         <GridViewColumn Header="Name" Width="Auto" DisplayMemberBinding="{Binding Path=sName}"/> 
         <GridViewColumn Header="Import File" Width="Auto" DisplayMemberBinding="{Binding Path=sImportFile}"/> 
        </GridView.Columns> 
       </GridView> 
      </ListView.View> 
     </ListView> 
     <Label x:Name="lblProgress" x:FieldModifier="public" Content="Status Text" HorizontalAlignment="Left" Margin="40,264,0,0" VerticalAlignment="Top" Grid.ColumnSpan="2" Width="369" BorderThickness="1" BorderBrush="#FF7C7C7C"/> 
     <Button x:Name="ComDialog" Grid.Column="1" HorizontalAlignment="Left" Margin="359,119,0,0" VerticalAlignment="Top" Width="48" Height="51" Grid.ColumnSpan="2"> 
      <Image x:Name="imgComDialog" HorizontalAlignment="Left" Height="44" VerticalAlignment="Top" Width="48" Source="C:\Users\Niclas VMWare\Documents\Visual Studio 2015\Projects\CloneMacro\CloneMacro\images\DialogID_6220_32x.png"/> 
     </Button> 
    </Grid> 
</Window> 

.CS

public MainWindow() 
    { 
     // Leave this to show the UI 
     InitializeComponent(); 

     lblProgress.Content = ""; 

     lvStores.ItemsSource = ReadCSV(@"C:\Users\Niclas VMWare\Downloads\TEST FILE.pcf"); 

     //SetButtonState(); 

     string sFile; 
    } 

    public class Store 
    { 
     public string sName { get; set; } 
     public string sImportFile { get; set; } 
     public string sID { get; set; } 
     public bool IsChecked { get; set; } 

     public Store(string id, string strName, string isChecked, string strImportFile) 
     { 
      sName = strName.Replace("\"",""); 
      sImportFile = strImportFile; 
      sID = id.Replace("\"",""); 

      int iBool = Convert.ToInt32(isChecked); 

      switch (iBool) 
      { 
       case 0: IsChecked = false; break; 
       case 1: IsChecked = true; break; 
       default: throw new InvalidOperationException("Third value in PCF file must be 0 or 1!"); 
      } 
     } 
    } 

    public IEnumerable<Store> ReadCSV(string fileName) 
    { 
     // Check file extension 
     string[] lines = File.ReadAllLines(Path.ChangeExtension(fileName, ".pcf"), Encoding.GetEncoding(65001)); 

     // lines.Select allows to project each line as a Store. 
     // This will give IEnumerable<Store> back. 
     return lines.Select(line => 
     { 
      string[] data = line.Split(','); 
      // Return store data with the data in order. 
      return new Store(data[0], data[1], data[2], fileName); 
     }); 
    } 
+0

你有任何代码来填充'ListView'吗? –

+0

@MattL。我更新了代码,希望它够了吗? – Niclas

+0

更新了带有工作代码的XAML和.CS,以防未来人们偶然发现此问题。 – Niclas

回答

1

修改您的ListView控件的第一列定义为

    <GridViewColumn Header="ID" Width="50"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Content="{Binding sID}" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 

我相信它会解决您的问题。数据绑定可能会受到影响,您将需要更多的XAML /代码来处理该问题。

我在这里所做的是采用GridViewColumn数据模板的默认定义,并将其替换为我自己的。您可以在Data templating主题中阅读更多内容。

+0

感谢您的回答。我刚刚尝试过,并且确实按照我的意愿添加了复选框。但是,它现在在ID列中显示复选框旁边的0/1。然后,实际ID例如名称栏显示“1662”,导入文件栏显示“Børster”。这是由于数据绑定?我用dataview加载更新了我的代码。 – Niclas

+0

以某种方式。但是,然后,您将代码中的0/1传递给sID。它应该是'返回新的商店(数据[1],string.Empty,Convert.ToInt32(数据[0]));' –

+0

我不能让它的工作。我得到一个DateTime异常。我想我需要做的是使用0/1填充复选框,然后在列中显示ID。 – Niclas

1

教我错了,但是您的csv文件包含列ID, Name, IsChecked,您将解析它到new Store(id: data[0], strName: data[1], strImportFile: data[2])

所以下面的例子你的新Store对象将具有以下值的属性:

public class Store 
{ 
    public string sName { get; set; }   // BØRSTER 
    public string sImportFile { get; set; } // 1 
    public string sID { get; set; }   // 1662 

    public Store(string id, string strName, string strImportFile) 
    { 
     sName = strName; 
     sImportFile = strImportFile; 
     sID = id; 
    } 
} 

你应该另一属性添加到您的类和其他参数的构造函数:

public bool IsChecked { get; set; } 

public Store(string id, string strName, string isChecked, string strImportFile) 
{ 
    sID = id; 
    sName = strName; 

    IsChecked = isChecked == "1"; 

    sImportFile = strImportFile; 
} 

因此,现在您可以致电
new Store(data[0], data[1], data[2], fileName)来创建新的Store实例。

结合现在看起来应该
<CheckBox IsChecked="{Binding IsChecked}" Content="{Binding sID}" />


至少让我给你一个样的建议。你可以看看Microsoft Naming Guidelines。 例如:属性应该在PascalCasing中命名,你也应该避免像strName这样的匈牙利符号。但这只是我个人的意见。

+0

感谢您的解决方案。这对我来说很合理,但是,我不明白为什么你在新的Store实例中有fileName。 – Niclas

+1

@Niclas我假设你想保存'string [] lines = File.ReadAllLines(Path.ChangeExtension(fileName,“.pcf”),Encoding.GetEncoding(65001));'的属性sImportFile和将sImportFile绑定到列_Import File_ –

+0

你是对的,我现在才注意到。但是,我无法让您的代码正常工作。我现在设法解决它,所以谢谢你指导我!将更新我的OP与答案。 – Niclas

相关问题