C# WPF-文本框赢得';无法响应多绑定中更改的属性

C# WPF-文本框赢得';无法响应多绑定中更改的属性,c#,wpf,binding,multibinding,C#,Wpf,Binding,Multibinding,我有一个文本框,应该显示颜色的十六进制值。应用程序可以处于两种状态: 1) 在编辑模式下(IsEdit==true),textbox绑定到我的模型属性并 2) 当未处于编辑模式(IsEdit==false)时,文本框绑定到滑块 表示RGB颜色。使用滑块更改每个颜色值时,文本框中的十六进制值也会更改,反之亦然。Textbox还绑定到我的模型属性,以便以后保存更改 问题:当应用程序处于编辑模式时,手动更改文本框文本属性会触发转换器并将文本值发送到模型和滑块,但当我更改滑块时,文本框文本会更改,但不会

我有一个文本框,应该显示颜色的十六进制值。应用程序可以处于两种状态:

1) 在编辑模式下(IsEdit==true),textbox绑定到我的模型属性并

2) 当未处于编辑模式(IsEdit==false)时,文本框绑定到滑块 表示RGB颜色。使用滑块更改每个颜色值时,文本框中的十六进制值也会更改,反之亦然。Textbox还绑定到我的模型属性,以便以后保存更改

问题:当应用程序处于编辑模式时,手动更改文本框文本属性会触发转换器并将文本值发送到模型和滑块,但当我更改滑块时,文本框文本会更改,但不会将数据发送到模型。为什么?我已经尝试了我能想到的一切。正在更改绑定模式,notifyontargetupdated…它应该可以工作…请有人解释一下

我试图简化,所以如果我错过了任何重要的东西,请让我知道

XAML代码:

<Rectangle Grid.Column="0" Width="120" Height="120" Stroke="Black" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,0,0" Fill="{Binding ElementName=tbxHexColor, Path=Text, Converter={StaticResource HexToColorConverter}}"/>
<TextBox x:Name="tbxHexColor" CharacterCasing="Upper">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEdit}" Value="False">
                    <Setter Property="Text" Value="{Binding SelectedColor.RGBHex}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsEdit}" Value="True">
                    <Setter Property="Text">
                    <Setter.Value>
                        <MultiBinding Converter="{StaticResource SlidersToHexConverter}" UpdateSourceTrigger="PropertyChanged">
                            <Binding ElementName="sliderRed" Path="Value"/>
                            <Binding ElementName="sliderGreen" Path="Value"/>
                            <Binding ElementName="sliderBlue" Path="Value"/>
                            <Binding Path="RGBHelper"/>
                        </MultiBinding>
                    </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>
<Slider x:Name="sliderRed" Grid.Column="1" Grid.Row="0" Margin="0,5,0,3" Maximum="255">
    <Slider.Style>
        <Style TargetType="Slider">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEdit}" Value="False">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=red, FallbackValue=0}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsEdit}" Value="True">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=red, Mode=OneTime}"/> 
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Slider.Style>
</Slider>
<Slider x:Name="sliderGreen" Grid.Column="1" Grid.Row="1" Margin="0,3" Maximum="255">
    <Slider.Style>
        <Style TargetType="Slider">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEdit}" Value="False">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=green, FallbackValue=0}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsEdit}" Value="True">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=green, Mode=OneTime}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Slider.Style>
</Slider>
<Slider x:Name="sliderBlue" Grid.Column="1" Grid.Row="2" Margin="0,3" Maximum="255">
    <Slider.Style>
        <Style TargetType="Slider">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEdit}" Value="False">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=blue, FallbackValue=0}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding IsEdit}" Value="True">
                    <Setter Property="Value" Value="{Binding SelectedColor.RGBHex, Converter={StaticResource HexToRGBConverter}, ConverterParameter=blue, Mode=OneTime}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Slider.Style>
</Slider>

转换器:

public class HexToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {    
        string input = "#" + value as string;
        if (string.IsNullOrEmpty(input) || input == "#" || input.Length < 7)
        {
            input = "#00FFFFFF";
        }

        return new SolidColorBrush((Color)ColorConverter.ConvertFromString(input));            
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}



public class SlidersToHexConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string hex = "";
        for (int i = 0; i < 3; i++)
        {
            int itemInt = System.Convert.ToInt32(values[i]);
            if (itemInt != 0)
            {
                string a = itemInt.ToString("X");
                if (a.Length == 1)
                {
                    hex += "0" + a;
                }
                else
                {
                    hex += a;
                }
            }
            else
            {
                hex += "00";
            }
        }

        return hex;                                   
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        object[] sliderValues = new object[4] { 0, 0, 0, "" };

        if (value.ToString().Length == 6)
        {
            string r = value.ToString().Substring(0, 2);
            string g = value.ToString().Substring(2, 2);
            string b = value.ToString().Substring(4, 2);

            double rr = int.Parse(r, NumberStyles.HexNumber);
            double gg = int.Parse(g, NumberStyles.HexNumber);
            double bb = int.Parse(b, NumberStyles.HexNumber);

            sliderValues[0] = (object)rr;
            sliderValues[1] = (object)gg;
            sliderValues[2] = (object)bb;
        }

        sliderValues[3] = value.ToString();

        return sliderValues;
    }
}



public class HexToRGBConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
        {
            return 0;
        }
        string hex = value.ToString();
        string colorHex = "0";
        switch (parameter.ToString())
        {
            case "red":
                colorHex = hex.Substring(0, 2);
                break;
            case "green":
                colorHex = hex.Substring(2, 2);
                break;
            case "blue":
                colorHex = hex.Substring(4, 2);
                break;
            default:
                break;
        }

        return int.Parse(colorHex, NumberStyles.HexNumber);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类HexToColorConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{    
字符串输入=“#”+值作为字符串;
if(string.IsNullOrEmpty(input)| | input==“#”| | input.Length<7)
{
输入=“#00FFFFFF”;
}
返回新的SolidColorBrush((颜色)ColorConverter.ConvertFromString(输入));
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
公共类滑块ToHexConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
字符串十六进制=”;
对于(int i=0;i<3;i++)
{
int itemInt=System.Convert.ToInt32(值[i]);
如果(itemInt!=0)
{
字符串a=itemInt.ToString(“X”);
如果(a.Length==1)
{
十六进制+=“0”+a;
}
其他的
{
十六进制+=a;
}
}
其他的
{
十六进制+=“00”;
}
}
返回十六进制;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
object[]sliderValues=新对象[4]{0,0,0,“”};
if(value.ToString().Length==6)
{
字符串r=value.ToString().Substring(0,2);
字符串g=value.ToString().Substring(2,2);
字符串b=value.ToString().Substring(4,2);
double rr=int.Parse(r,NumberStyles.HexNumber);
double gg=int.Parse(g,NumberStyles.HexNumber);
double bb=int.Parse(b,NumberStyles.HexNumber);
SliderValue[0]=(对象)rr;
sliderValues[1]=(object)gg;
SliderValue[2]=(对象)bb;
}
sliderValues[3]=value.ToString();
返回sliderValues;
}
}
公共类HexToRGBConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值==null)
{
返回0;
}
字符串十六进制=value.ToString();
字符串colorHex=“0”;
开关(参数.ToString())
{
案例“红色”:
colorHex=十六进制子字符串(0,2);
打破
案例“绿色”:
colorHex=十六进制子串(2,2);
打破
案例“蓝色”:
colorHex=十六进制子串(4,2);
打破
违约:
打破
}
返回int.Parse(colorHex,NumberStyles.HexNumber);
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
在XAML的多绑定部分尝试了一切。更改:NotifyOnSourceUpdated、NotifyOnTargetUpdated、Mode、UpdateSourceTrigger。。。什么都不管用