2016-01-25 2 views
0

Я пытаюсь изучить MultiBinding. Я пытаюсь передать два значения (один double и один boolean) от viewmodel до конвертера и вернуть результат string.Невозможно лить объект в WPF MultiValueConverter

XAML

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource MyValueConverter}"> 
       <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ScrollViewer}" Path="DataContext.SelectedCar.PowerValue" /> 
       <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ScrollViewer}" Path="DataContext.SelectedCar.IsPowerAvailable" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Преобразователь

class MyValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (System.Convert.ToBoolean(values[1])) 
     { 
      return string.Format("{0:n1}", values[0]); 
     } 
     else 
     { 
      return "[not available]"; 
     } 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

ViewModel

public double PowerValue 
public bool IsPowerAvailable 

В преобразователе я получаю исключение Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.IConvertible.

Что это значит? Я неправильно использовал MultiBinding?

EDIT:

ViewModel выглядит следующим образом

class CarViewModel : ViewModelBase 
{ 
    private car _selectedCar; 
    public car SelectedCar 
    { 
     get { return _selectedCar; } 
     set 
     { 
      _selectedCar = value; 
     } 
    } 

Модель выглядит следующим образом:

class car 
{ 
    public double PowerValue { get; set; } 
    public bool IsPowerAvailable{ get; set; } 
} 
+0

Вы могли бы найти некоторые подсказки в этой подобной теме: http://stackoverflow.com/questions/18866308/unable -to-cast-object-of-type-ms-internal-namedobject-to-bitmapimage – SnowballTwo

+0

Почему вы используете relativeSource? Есть ли у вас разные datacontexts? –

+0

Нет, у меня только один файл данных. Я попробовал немало альтернатив, также без RelativeSource, но они не работали ни – Nuts

ответ

0

Исключение связано с тем, что DataContext.SelectedCar.IsPowerAvailable не может быть достигнуто , убедитесь, что свойство SelectedCar действительно доступно из DataContext, здесь рабочий образец

Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Window.Resources> 
    <wpfApplication12:MyValueConverter x:Key="MyValueConverter"/> 
</Window.Resources> 
<Grid>  
    <ScrollViewer> 
     <TextBlock> 
      <TextBlock.Text> 
       <MultiBinding Converter="{StaticResource MyValueConverter}"> 
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ScrollViewer}" Path="DataContext.SelectedCar.PowerValue" /> 
        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=ScrollViewer}" Path="DataContext.SelectedCar.IsPowerAvailable" /> 
       </MultiBinding> 
      </TextBlock.Text> 
     </TextBlock> 
    </ScrollViewer> 
</Grid> 

и selectedCar определяется в VM/CodeBhind:

private Car _selectedCar = new Car() 
    { 
     IsPowerAvailable = true, 
     PowerValue = 14 
    }; 
    public Car SelectedCar 
    { 
     get 
     { 
      return _selectedCar; 
     } 

     set 
     { 
      if (_selectedCar == value) 
      { 
       return; 
      } 

      _selectedCar = value;     
     } 
    } 
+0

Если DataContext.SelectedCar.IsPowerAvailable не может быть достигнуто, почему я могу правильно получить значение, изменив привязку к Text = "{Binding SelectedCar.PowerValue, Mode = OneWay, StringFormat = n1}" (отредактировал также начальную запись, чтобы показать viewmodel и model) – Nuts

+0

по Text = "{Binding SelectedCar .. вы используете TextBlock DataContext, в примере, который вы предоставили, вы используете ScrollViewer DataContextx (..AncestorType = ScrollViewer), убедитесь, что DataContext ScrollViewer правильно установлен! , если да, то pls показать мне, что вы полный xaml – Usama

+0

В моем UserControl я установил и datacontext больше не установлен. TextBlock находится внутри ScrollViewver – Nuts

Смежные вопросы