【问题标题】:Multibinding with RelayCommand returns unset values使用 RelayCommand 进行多重绑定返回未设置的值
【发布时间】:2019-12-17 08:13:12
【问题描述】:

我有一个绑定到我拥有的菜单项的命令,我想传递多个参数。我试过使用转换器,但它似乎什么也没返回。

我的转换器

public class AddConverter : IMultiValueConverter {
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return values.Clone();
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}

包含我的命令的我的视图模型

class myViewModel: ViewModelBase {

private RelayCommand testCommand;

        public ICommand TestCommand {
            get {
                if (testCommand == null) {
                    testCommand = new RelayCommand((param) => test((object[])param));
                }
                return testCommand ;
            }
        }

        //Only trying to print out one of the params as a test
        public void test(object parameter) {
            var values = (object[])parameter;
            int num1 = Convert.ToInt32((string)values[0]);
            MessageBox.Show(num1.ToString());
        }

我的菜单项绑定

//Using tags as a test
<ContextMenu>
    <MenuItem Name="testing" Header="Move to Position 10" Command="{Binding TestCommand}" Tag="7">
        <MenuItem.CommandParameter>
             <MultiBinding Converter="{StaticResource AddConverter}">
                 <Binding ElementName="testing" Path="Tag"/>
                 <Binding ElementName="testing" Path="Tag"/>
             </MultiBinding>
        </MenuItem.CommandParameter>
    </MenuItem>
</ContextMenu>

调试后,当我打开包含菜单项的窗口时,转换器启动,此时值对象为空。然后,当我选择菜单项并触发命令时,当我执行时,参数为空。我不明白为什么我的转换器在我点击菜单项之前就启动了,或者为什么这些值为空。

【问题讨论】:

    标签: c# wpf multibinding relaycommand


    【解决方案1】:

    尝试将绑定的ElementName 替换为RelativeSource。这对我有用:

    <MenuItem Name="testing" Header="Move to Position 10" Command="{Binding TestCommand}" Tag="7">
        <MenuItem.CommandParameter>
            <MultiBinding Converter="{StaticResource AddConverter}">
                <Binding Path="Tag" RelativeSource="{RelativeSource Self}"/>
                <Binding Path="Tag" RelativeSource="{RelativeSource Self}"/>
            </MultiBinding>
        </MenuItem.CommandParameter>
    </MenuItem>
    

    另外请注意,您应该绑定到 TestCommand 属性,而不是 testCommand 字段。

    【讨论】:

    • 这是我的错字,这解决了我的问题。现在,如果在DataGrid 中绑定到SelectedItem,我该怎么办?上下文菜单实际上包含在数据网格中,转换器在我选择一个项目之前启动,这对于标签部分来说很好,但我想知道是否可以通过多重绑定传递标签和选定的数据网格项目?
    • 您可以将DataGridSelectedItem 属性绑定到视图模型的源属性。然后你不需要将它作为参数传递给命令。但是,如果您有其他问题,请提出一个新问题。
    猜你喜欢
    • 2018-10-26
    • 2013-02-19
    • 2016-02-02
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多