Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# narios,对某些人来说可能不符合“从XAML调用方法”(因为它们不是通用调用),您可以始终使用ObjectDataProvider调用任何可以返回任何类型值的方法。可以对实例调用方法,也可以调用静态方法。您可以将参数传递给该方法。您甚至可以调用构造函数来创建对象的实例。(警告:尝试将此应用到您的场景中可能很有诱惑力……不要这样做!它可能无论如何都不起作用,因为ObjectDataProvider是一种一次性的东西。但是,即使您以某种方式绕过它,也肯定是处理此场景的错误方式。)_C#_Wpf_Xaml_Combobox_Itemssource - Fatal编程技术网

C# narios,对某些人来说可能不符合“从XAML调用方法”(因为它们不是通用调用),您可以始终使用ObjectDataProvider调用任何可以返回任何类型值的方法。可以对实例调用方法,也可以调用静态方法。您可以将参数传递给该方法。您甚至可以调用构造函数来创建对象的实例。(警告:尝试将此应用到您的场景中可能很有诱惑力……不要这样做!它可能无论如何都不起作用,因为ObjectDataProvider是一种一次性的东西。但是,即使您以某种方式绕过它,也肯定是处理此场景的错误方式。)

C# narios,对某些人来说可能不符合“从XAML调用方法”(因为它们不是通用调用),您可以始终使用ObjectDataProvider调用任何可以返回任何类型值的方法。可以对实例调用方法,也可以调用静态方法。您可以将参数传递给该方法。您甚至可以调用构造函数来创建对象的实例。(警告:尝试将此应用到您的场景中可能很有诱惑力……不要这样做!它可能无论如何都不起作用,因为ObjectDataProvider是一种一次性的东西。但是,即使您以某种方式绕过它,也肯定是处理此场景的错误方式。),c#,wpf,xaml,combobox,itemssource,C#,Wpf,Xaml,Combobox,Itemssource,问题是:我不知道在哪里调用这个方法 最有可能的是,你根本不应该叫它。我基于这一说法: 方法的结果应设置为ItemsSource 这说明您有这些项控件(例如,组合框),您应该在其中通过CollectionViewSource对象间接绑定工作表列集合。CollectionViewSource对象将允许您过滤视图,您可以通过提供方法中当前的谓词来进行过滤,即header=>header.ID==0 | | header.Selected==false | | header.ID==keepColumn

问题是:我不知道在哪里调用这个方法

最有可能的是,你根本不应该叫它。我基于这一说法:

方法的结果应设置为ItemsSource

这说明您有这些项控件(例如,
组合框
),您应该在其中通过
CollectionViewSource
对象间接绑定
工作表列
集合。
CollectionViewSource
对象将允许您过滤视图,您可以通过提供方法中当前的谓词来进行过滤,即
header=>header.ID==0 | | header.Selected==false | | header.ID==keepColumn

不清楚
keepColumn
参数来自何处,但是如果它不是视图模型中某个地方已经存在的属性,那么它可能应该是。在任何情况下,一旦您进一步研究了集合绑定模型并了解了
CollectionViewSource
的工作原理,我希望您能够找到在过滤器中获取
keepColumn
值的方法,而不会遇到太多麻烦

如果在研究相关文档并尝试解决问题后,您仍然无法确定如何使其正常工作,并且您的同事无法帮助您,请随时发布新问题。但在这个问题上,请确保包含一个好的代码,它清楚地显示了您的尝试,并详细解释了代码的作用、您希望它做什么,以及您具体需要什么帮助

顺便说一下

我已经读到不可能从XAML调用方法

嗯,那不是真的。至少有四种方法可以“从XAML调用”(取决于具体的含义):

  • 事件处理程序。发布事件的XAML对象将使这些事件在XAML中显示为属性。您可以将属性值设置为方法的名称,该方法将为您订阅事件
  • ICommand
    绑定。在大多数情况下,您可以提供
    ICommand
    ,也可以选择传递
    CommandParameter
    。这是传递给
    ICommand
    CanExecute()
    Execute()
    方法的
    对象
    引用。可以通过传递数组来传递多个参数。由于任何原因执行命令时,都会调用
    ICommand.Execute()
    方法
  • IValueConverter
    IMultiValueConverter
    。这些也需要参数。当需要值转换时,通常在绑定上下文中调用接口中的相关方法
  • 最后,虽然以上都是专门的场景,对某些人来说可能不符合“从XAML调用方法”(因为它们不是通用调用),但您始终可以使用
    ObjectDataProvider
    调用任何可以返回任何类型值的方法。可以对实例调用方法,也可以调用静态方法。您可以将参数传递给该方法。您甚至可以调用构造函数来创建对象的实例。(警告:尝试将此应用到您的场景中可能很有诱惑力……不要这样做!它可能无论如何都不起作用,因为
    ObjectDataProvider
    是一种一次性的东西。但是,即使您以某种方式绕过它,也肯定是处理此场景的错误方式。)

您可以将方法更改为允许
绑定的属性

公共类导入列{
私人国际保密专栏;
公共列表工作表ColumnHeaders=>工作表Columns.Where(header=>header.ID==0 | | | header.Selected==false | | | header.ID==keepColumn)。ToList();
}
您必须将其放入一个新类中,并将每个
ItemsSource
绑定到此属性,如下所示:



但这不是绑定的正确方式,因为您不应该混合视图和数据,您应该查看MVVM模式,并查看其他答案建议的
ICommand

您可以将方法更改为允许
绑定的属性:

公共类导入列{
私人国际保密专栏;
公共列表工作表ColumnHeaders=>工作表Columns.Where(header=>header.ID==0 | | | header.Selected==false | | | header.ID==keepColumn)。ToList();
}
您必须将其放入一个新类中,并将每个
ItemsSource
绑定到此属性,如下所示:


但这不是绑定的正确方式,因为您不应该将视图和数据混合在一起,您应该查看MVVM模式,并查看其他答案建议的
ICommand

尝试使用转换器

[ValueConversion(typeof(List<WorksheetColumn>), typeof(List<WorksheetColumn>))]
public class ListFilterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        List<WorksheetColumn> worksheets = value as List<WorksheetColumn>;
        int keepColumn = (int)parameter;

        return worksheets.Where(header => header.ID == 0 || header.Selected == false || header.ID == keepColumn).ToList();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
[ValueConversion(typeof(List),typeof(List))]
公共类ListFilterConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
列表工作表=值为列表;
int keepColumn=(int)参数;
返回工作表。其中(header=>header.ID==0 | | | header.Selected==false | | header.ID==keepColumn)。ToList();
}
公共对象ConvertBack(对象值,Ty
<ListView Grid.Row="0" Name="listView" IsSynchronizedWithCurrentItem="True" SelectionMode="Single" Margin="10" ItemsSource="{Binding ImportColumns}" >

            <ListView.View>
                <GridView AllowsColumnReorder="False">

                    <GridViewColumn Header="File column" DisplayMemberBinding="{Binding FileColumnHeader}"/>

                    <GridViewColumn Header="Worksheet column" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>

                                <ComboBox VerticalAlignment="Center" DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" ItemsSource="{Binding ListOfWorksheetColumns.UnselectedWorksheetColumns, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="ComboBox_SelectionChanged" SelectedIndex="0">

                                </ComboBox>

                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>

        </ListView>
public class ImportManagerViewModel : BaseViewModel
{
    public List<ImportColumn> ImportColumns { get; set; }
    public ListOfWorksheetColumnHeaders ListOfWorksheetColumns { get; set; }

    public bool IsAnyColumnImported
    {
        get;
        set;
    }

    public void OnImportItemPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        IsAnyColumnImported = ImportColumns.Any(x => x.TargetColumnIndex != 0);
    }

    public void OnWorksheetItemPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        ListOfWorksheetColumns.UnselectedWorksheetColumns = new ObservableCollection<WorksheetColumn>(ListOfWorksheetColumns.WorksheetColumns.Where(header => header.ID == 0 || header.Selected == false /*|| header.ID == 1*/));
    }
}
public class ListOfWorksheetColumnHeaders : BaseViewModel
{

    public ObservableCollection<WorksheetColumn> WorksheetColumns { get; set; } = new ObservableCollection<WorksheetColumn>();

    public ObservableCollection<WorksheetColumn> UnselectedWorksheetColumns
    {
        get;
        set;
    }

    public List<WorksheetColumn> GetWorksheetColumnHeaders(int keepColumn)
    {
        return WorksheetColumns.Where(header => header.ID == 0 || header.Selected == false || header.ID == keepColumn).ToList();
    }
}
public class WorksheetColumn : BaseViewModel
{
    public int ID;

    public string ColumnName { get; set; }
    public bool Selected
    {
        get;
        set;
    }

    public override string ToString()
    {
        return ColumnName;
    }
}
[ValueConversion(typeof(List<WorksheetColumn>), typeof(List<WorksheetColumn>))]
public class ListFilterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        List<WorksheetColumn> worksheets = value as List<WorksheetColumn>;
        int keepColumn = (int)parameter;

        return worksheets.Where(header => header.ID == 0 || header.Selected == false || header.ID == keepColumn).ToList();
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
    <ListView Grid.Row="0" Name="listView" IsSynchronizedWithCurrentItem="True" SelectionMode="Single" Margin="10" ItemsSource="{Binding ImportColumns}" >
        <ListView.Resources>
            <local:ListFilterConverter x:Key="myConverter" />
            <sys:Int32 x:Key="keepcolumn1">1</sys:Int32>
        </ListView.Resources>

        <ListView.View>
            <GridView AllowsColumnReorder="False">

                <GridViewColumn Header="File column" DisplayMemberBinding="{Binding FileColumnHeader}"/>

                <GridViewColumn Header="Worksheet column" >

                    <GridViewColumn.CellTemplate>
                        <DataTemplate>

                            <ComboBox VerticalAlignment="Center" DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" 
                                      ItemsSource="{Binding ListOfWorksheetColumns.UnselectedWorksheetColumns, Converter={StaticResource myConverter}, ConverterParameter={StaticResource keepcolumn1}}" 
                                      SelectionChanged="ComboBox_SelectionChanged" SelectedIndex="0">

                            </ComboBox>

                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

            </GridView>
        </ListView.View>

    </ListView>