WPF 멀티 바인딩시 CASTING 에러

CONVERTER

using System;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;

{
public class BackGroundColorConverters : IMultiValueConverter
{
public object Convert(object values, Type targetType, object parameter, CultureInfo culture)
{

        SolidColorBrush color = new SolidColorBrush(Colors.Transparent);

        if (values == null)
        {
            return color;
        }
        bool A= (bool)(values[0]);
        bool B= (bool)values[1];

        if (A&& B)
        {
            color = new SolidColorBrush(Colors.Red);
        }

        else if (A== true && B== false)
        {
            color = new SolidColorBrush(Colors.Gray);

        }
        else if (A== true && B== true)
        {
            color = new SolidColorBrush(Colors.Green);
        }
        
        else
        {
            color = new SolidColorBrush(Colors.LightBlue);
        }
        return color;

    }

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

}

XAML

                <Rectangle.Fill>
                    <MultiBinding Converter="{StaticResource BackGroundColorConverters}">
                        <Binding Path="CheckAStatus"/>
                        <Binding Path="CheckDStatus"/>
                    </MultiBinding>
                </Rectangle.Fill>
            </Rectangle>

ViewModel

private bool _checkAStatus;
public bool CheckAStatus
{
get => _checkAStatus;
set => SetProperty(ref _checkAStatus, value);

    }

    private bool _checkDStatus;
    public bool CheckDStatus
    {
        get => _checkDStatus;
        set => SetProperty(ref _checkDStatus, value);
    }

public ViewModel()
{
this.CheckAstatus = false;
this.CheckDstats = true;
}

두 값의 상태 변화에따라 색 변화를 주고싶은데
System.InvalidCastException: ‘Unable to cast object of type ‘MS.Internal.NamedObject’ to type ‘System.Boolean’.’
라는 오류를 던집니다. 값 자체는 바인딩이 됐는데 형 변환이 안되는거 같은데 이유를 못찾겠습니다
multiconverter말고 그냥 converter하면 잘 되는데 이해가 안됩니다;

수정

2개의 좋아요

DataContext가 제대로 할당된 게 맞는지 한 번 확인해 보세요.

2개의 좋아요

그 문제밖에 없는거같은데 MULTIVALUE가 아니라 SINGLEVALUE로 할때는 되거든요. 그래서 DATACONTEXT 할당문제는 아닌거같습니다 ㅜ

2개의 좋아요

@redstone 소스코드 작성해주실 때 > 말고 ``` 으로 코드를 감싸주시면 더 보기 좋습니다. :smile:
그리고 간단한 샘플을 github 또는 압축해서 올려주시면 문제를 더 빨리 해결하실 수 있을 것 같습니다!

1개의 좋아요
  1. 디자인 타임에서만 오류가 발생하는지, 혹은 런타임에서도 오류가 발생하는지 여부
  2. DataContext의 할당 방식이 어떻게 되는지
    (View의 Xaml에서 할당하는지, 코드 비하인드에서 할당하는지, DataTemplate을 이용해 할당하는지, 코드 비하인드라면 정확히 어느 시점에 할당하는지)

이런 부가 정보들을 첨부해 주시면 문제 해결에 도움이 될 듯합니다.

2개의 좋아요

this.DataContext = App.Current.Services.GetService();
아래와 같이 mvvmtoolkit을 이용하여 할당합니다.

2개의 좋아요

문제 되는 프로젝트를 최소화 해서 올려주시겠어요?

3개의 좋아요

혹시 xaml의 Rectangle 부분이
DataGrid 안에 아이템 템플릿 안에서 구현되는 부분인거 아닌가요?
그런 경우라면 바인딩 된 뷰모델을 못 찾습니다.
만약에 그런 경우라면

<Rectangle>
    <Rectangle.Fill>
        <MultiBinding Converter="{StaticResource BackGroundColorConverters}">
          <Binding Source="{RelativeSource AncestorType={x:Type 뷰타입}}" Path="DataContext.CheckAStatus" />
          <Binding Source="{RelativeSource AncestorType={x:Type 뷰타입}}" Path="DataContext.CheckDStatus" />
        </MultiBinding>
    </Rectangle.Fill>
</Rectangle>

이런식으로 구성하셔야 DataContext를 찾습니다.

4개의 좋아요

좀 다른 이야기긴한데
bool 형변환시 value의 타입 체크나 bool.TryParse 같이 예외를 위한 처리를 해주면 좋지 않을까 싶습니다ㅎㅎ

4개의 좋아요

그리고 저 정도의 기능이면 컨버터를 굳이 안쓰고 MultiTrigger쓰면 갸꿀입니다ㅎㅎ

3개의 좋아요

혹시 @BOBx5 님께서 말씀하신것과 같이
바인딩을 건 곳이 DataGrid나 ItemsControl의 item이라면
RelativeSource의 Mode를 FindAncestor, AncestorType을 item의 상위 컨트롤(DataGrid나 ItemsControl)에 두고 써보세욥ㅎㅎ

3개의 좋아요

아고 다른일때문에 답이늦었네요 다들간사합니다

1개의 좋아요
  if (values == null || values.Length < 2 || !(values[0] is bool A) || !(values[1] is bool B)
        return Binding.DoNothing;

정답을 찾았네요. 이유는 모르겠는데 에러설정을 하니까 잘 해결됩니다…

3개의 좋아요

아마 짜놓으신 코드상 DataContext에 뷰모델이 할당되기 전에 바인딩이 먼저 동작하는 것 같네요.

5개의 좋아요

values 사용전에 예외를 설정하고 해결 되셨다면, values 배열에 어떤 값들이 들어왔는지, 값이 안들어 온건지… 등 if로 왜 빠졌는지 공유 부탁드려도 될까요? 그런 정보를 공유해주시면 다음에 동일한 증상으로 헤매고있는 어린양들에게 큰 도움이 되고 좋잖아유 ㅎㅎ

2개의 좋아요

제가 그정도로 정확하게 진단할 실력을 갖고 있지않아서, 이유를 확실하게 진단하지는 못하겠는데
하나 이상했던점은 VALUES.LENGTH를 찍어보면 값이 2개인데도 3이 나오더라구요. Length에 대한 에러처리를 해주니 해결이되었습니다

1개의 좋아요

시간 되실 때 문제 해결의 원인을 분석하셔서 댓글로 알려주시면 비슷한 문제가 생길 때 도움이 되는 글이 될 것 같습니다.

2개의 좋아요