Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# 如何从Convert获取ConvertBack参数? 问题是:_C#_Wpf_Mvvm_Imultivalueconverter - Fatal编程技术网

C# 如何从Convert获取ConvertBack参数? 问题是:

C# 如何从Convert获取ConvertBack参数? 问题是:,c#,wpf,mvvm,imultivalueconverter,C#,Wpf,Mvvm,Imultivalueconverter,我使用带有转换器的多重绑定将(x,y)坐标传递到方法中 而且我不能让它反向工作: public class MyConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { var x = (int)values[0]; var y = (int)v

我使用带有转换器的
多重绑定
(x,y)
坐标传递到方法中

而且我不能让它反向工作:

public class MyConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var x = (int)values[0];
        var y = (int)values[1];
        return Model.Get(x, y);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        Model.Set(x, y, value); // how to get x, y here?
        return new object[] { Binding.DoNothing, Binding.DoNothing };
    }
}
其他信息: 数据将以表格的形式可视化。以下是单元格模板:

<TextBox>
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource converter}" Mode="TwoWay">
            <Binding Path="X" Mode="OneWay" />
            <Binding Path="Y" Mode="OneWay" RelativeSource="..." />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

其思想是使用转换器,它接收
x
(从单元视图模型)和
y
(从父列视图模型,注意
相对资源
)并调用
Get(x,y)
,以显示值

但是,当用户输入某个内容时,会调用
ConvertBack
,我需要调用
Set(x,y,value)
方法


如何将
x
y
传递到
ConvertBack

简单的回答是,在
ConvertBack
方法中,无法直接获得
x
y
的值。
IMultiValueConverter
将多个值转换为单个值。因此,
ConvertBack
方法的作用正好相反:将单个值转换为多个值

这完全取决于Model.Get(x,y)方法返回的内容。它需要返回一个足够唯一的值,以便从中分别获得
x
y


示例:为每对(x,y)创建唯一的字符串。

要使这样的多值转换器工作,可能会有或多或少的麻烦。但我建议您保持多值转换器为单向,但返回一个包装实际文本属性的容器对象

与其直接绑定到
TextBox.Text
属性,不如绑定到其他属性(例如
DataContext
标记
),然后将文本绑定到容器值

小例子:

<TextBox Text="{Binding Value}">
    <TextBox.DataContext>
        <MultiBinding Converter="{StaticResource cMyConverter}">
            <Binding Path="X"/>
            <Binding Path="Y"/>
        </MultiBinding>
    </TextBox.DataContext>
</TextBox>
似乎很难将参数传递到
ConvertBack
。这可能是可能的,但有一个解决办法,这使得
ConvertBack
变得不必要。感谢@XAMlMAX的创意

实现它的一种可能性(可能有更好的方法)是使用数据模板。我们可以将
ContentControl.Content
与一些viewmodel绑定,而不是使用
TextBlock.Text
string
进行多绑定,该viewmodel应该完成剩余的工作,包括
Set(x,y,value)
调用

以下是代码:

public class ViewModel
{
    public int X { get; set; }
    public int Y { get; set; }

    string _text;
    public string Text
    {
        get { return _text; }
        set
        {
            // this should be only called by the view
            _text = value;
            Model.Set(X, Y, value);
        }
    }

    public ViewModel(string text)
    {
        _text = text;
    }
}

public class MyConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var x = (int)values[0];
        var y = (int)values[1];
        return new ViewModel(Model.Get(x, y)) { X = x, Y = y };
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
xaml将成为

<ContentControl Focusable="False">
    <ContentControl.Content>
        <MultiBinding Converter="{StaticResource converter}">
            <Binding Path="X" />
            <Binding Path="Y" RelativeSource="..."/>
        </MultiBinding>
    </ContentControl.Content>
</ContentControl>

数据模板在哪里

<DataTemplate DataType="{x:Type local:ViewModel}">
    <TextBox Text="{Binding Text}" />
</DataTemplate>


What
Model.Get
returns?如何调用
ConvertBack
或如何调用它?不能将x和y传递给ConvertBack方法。ConvertBack方法的工作是将输入值转换为x和y。你需要一个可以返回x和y的方法(例如,在你的模型中)。如果用户输入的是字符串,你必须解析这个字符串并得到x和y。@Yevgeniy,cannot不是我同意的答案。目前我正在考虑使用
字典
,但是我在传递键时遇到了问题,应该是控件的实例,我希望有一种更简单的方法。请注意对
x
y
的单向绑定,我不打算更改它们,只是在用户更改文本时调用
Set
方法。您还可以在转换器上添加
DependencyProperties
,以便可以绑定到它们。因此,当调用ConvertBack时,它会触发这些属性。我喜欢这种方法!这样
TextBox
将调用代理对象上的ToString()。@XAMlMAX wait,什么?它将如何调用
ToString()
?如果将
Text
属性设置为
Binding。
它将调用
DataContext
对象上的
ToString()
。@XAMlMAX这就是我绑定到
值的原因。
。。。绑定到
会破坏所需的
双向
绑定到
文本
好吧,我仍然喜欢它,upvote将保持不变,至少这是我使用它的方式,如果我必须实现这样的目标的话。谢谢
<DataTemplate DataType="{x:Type local:ViewModel}">
    <TextBox Text="{Binding Text}" />
</DataTemplate>