将参数从XAML传递给方法

问题描述 投票:0回答:3

我当时是advised,将一种方法放在类中以获得自定义项的子集合。每个自定义项目都具有诸如ID(int),名称(字符串)和Selected(布尔)之类的属性。该方法返回所有未选中的项目,一个ID为0的项目,以及由参数指定的另一个项目:

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

问题是:我不知道在哪里调用该方法。我已经读到不可能从XAML调用方法,但是该方法的结果应设置为ItemsSource到多个ComboBoxes(由于该“ keepColumn”参数,每个都有不同的ItemsSource-这就是目标)。

我有XAML,ComboBox_SelectionChanged事件和OnWorksheetItemPropertyChanged(在更改“ Selected”时发生)。他们中的任何一个都正确吗?

Update现在,我的XAML使用的是属性,它不返回所需的项目,而不是方法:

<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>

P.S。我知道什么是绑定,命令,MVVM,WPF和C#。

c# wpf xaml combobox itemssource
3个回答
1
投票

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

[最有可能,您根本不应该称呼它。我基于此声明:

方法的结果应设置为ItemsSource

这告诉我,您具有这些项控件(例如ComboBox),您在[[应该所做的事情是通过WorksheetColumns对象间接绑定CollectionViewSource集合。 CollectionViewSource对象将允许您过滤视图,您可以通过提供当前在方法中具有的谓词即header => header.ID == 0 || header.Selected == false || header.ID == keepColumn来执行此操作。尚不清楚keepColumn参数的来源,但如果它不是视图模型中的某个属性,则可能应该已经存在。无论如何,一旦您进一步研究了集合绑定模型并了解了CollectionViewSource的工作原理,我希望您将能够弄清楚如何在过滤器中获得keepColumn值,而不会带来太多麻烦。

如果在研究了相关文档并尝试解决该问题后,您仍然无法找到解决方法,而您的同事也无法为您提供帮助,请随时提出新问题。但是在这个问题上,请确保您包含一个良好的Minimal, Reproducible Example,以清楚地显示您已经尝试过的内容,并详细说明该代码的功能,您希望它执行的操作以及您特别需要帮助的内容。] >

顺便说一下...

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

嗯,那不是真的。可以至少有四种主要方法可以从XAML中调用方法(取决于确切的含义):

    事件处理程序。发布事件的XAML对象将使这些事件在XAML中显示为属性。您可以将属性值设置为方法的名称,该方法将为您预订该事件。
  • ICommand绑定。您可以在大多数地方提供ICommand,也可以选择传递CommandParameter。这是传递给objectICommand方法的CanExecute()参考。您可以通过传递数组来传递多个参数。由于任何原因执行命令时,都会调用Execute()方法。
  • ICommand.Execute()IValueConverter。这些也带有参数。通常在绑定的上下文中,需要进行值转换时,将调用接口中的相关方法。
  • 最后,虽然以上都是专门的场景,并且在某些情况下可能不符合“从XAML调用方法”的条件(因为它们不是
  • general Purpose
  • 调用),但是您始终可以使用IMultiValueConverter来调用可以返回任何类型值的任何方法。您可以在实例上调用方法,也可以在静态方法上调用。您可以将参数传递给方法。您甚至可以调用构造函数来创建对象的实例。 (警告:可能会很想尝试将它塞入您的方案中……请不要这样做!由于ObjectDataProvider是一种一次性的操作,因此无论如何都可能不起作用。但是即使您以某种方式进行破解,也绝对是解决此问题的错误方法。)
    您可以将方法更改为允许ObjectDataProvider的属性:

    Binding

    您必须将其放在新类中,并将每个public class ImportColumn {
        private int keepColumn;
    
        public List<WorksheetColumn> WorksheetColumnHeaders => WorksheetColumns.Where(header => header.ID == 0 || header.Selected == false || header.ID == keepColumn).ToList();
    }
    绑定到此属性,如下所示:

    ItemsSource

    但是这不是进行绑定的正确方法,因为您不应该混合使用视图和数据,应该查看MVVM模式,并根据其他答案的建议查看<ComboBox ItemsSource="{Binding WorksheetColumnHeaders}"/>
    

    尝试使用转换器

    ICommand

    xaml是..

    [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(); } }


    0
    投票
    您可以将方法更改为允许ObjectDataProvider的属性:

    0
    投票
    尝试使用转换器
    © www.soinside.com 2019 - 2024. All rights reserved.