C# narios,对某些人来说可能不符合“从XAML调用方法”(因为它们不是通用调用),您可以始终使用ObjectDataProvider调用任何可以返回任何类型值的方法。可以对实例调用方法,也可以调用静态方法。您可以将参数传递给该方法。您甚至可以调用构造函数来创建对象的实例。(警告:尝试将此应用到您的场景中可能很有诱惑力……不要这样做!它可能无论如何都不起作用,因为ObjectDataProvider是一种一次性的东西。但是,即使您以某种方式绕过它,也肯定是处理此场景的错误方式。)
问题是:我不知道在哪里调用这个方法 最有可能的是,你根本不应该叫它。我基于这一说法: 方法的结果应设置为ItemsSource 这说明您有这些项控件(例如,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
组合框
),您应该在其中通过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>