2013-08-15 4 views
0

У меня есть образец кода, который предполагает установить ширину прямоугольника из конвертера. Я вижу, что конвертер вызывается дважды (второй раз с требуемым значением), но значение, похоже, не достигает свойства Width прямоугольника.MultiConverter возвращает значение, но значение не задано в свойстве width

Примечание: Я использую прямоугольник с целью вместо ProgressBar - требования

Вот XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:viewmodel="clr-namespace:WpfApplication1" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <viewmodel:CalcWidthFromPercentageConverter x:Key="CalcWidthFromPercentageConverter" /> 
</Window.Resources> 
<Window.DataContext> 
    <viewmodel:ViewModel/> 
</Window.DataContext> 
<Grid> 
    <Border x:Name="borderParent" Height="20" HorizontalAlignment="Stretch" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Center"> 
     <Rectangle Fill="Red" Height="20" HorizontalAlignment="Left"> 
      <Rectangle.Width> 
       <MultiBinding Converter="{StaticResource CalcWidthFromPercentageConverter}"> 
        <Binding Path="ProgressWidthPercentage"/> 
        <Binding Path="ActualWidth" ElementName="borderParent"></Binding> 
       </MultiBinding> 
      </Rectangle.Width> 
     </Rectangle> 
    </Border> 
</Grid> 

здесь преобразователь

public class CalcWidthFromPercentageConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Count() == 2) 
     { 
      decimal inputPercentage = (decimal)values[0]; 
      decimal borderWidth = System.Convert.ToDecimal(values[1]); 
      decimal result = borderWidth * inputPercentage; 
      return result; 
     } 
     return values; 
    } 

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

и длиться viewmodel

public class ViewModel 
{ 
    private readonly decimal _progressWidthPercentage; 

    public decimal ProgressWidthPercentage 
    { 
     get { return _progressWidthPercentage; } 
    } 

    public ViewModel() 
    { 
     _progressWidthPercentage = (decimal)0.37; 
    } 
} 
+1

Две вещей я хотел бы предложить вам:. Ширина измеряется в Double Use Double. вместо десятичного. Более важно: не возвращайте «значения» по умолчанию, так как он не доставляет действительное двойное значение, а не объект []. Это приведет к сбою привязки. – JanW

+0

Это ваша вся модель представления? , то вам не хватает требуемой реализации интерфейса 'INotifyPropertyChanged' ..., который бы объяснил вашу проблему. – Sheridan

+0

Поскольку я просто устанавливаю десятичное значение в ctor, тогда нет необходимости в уведомлении об изменении свойства. –

ответ

0

Просто копия «JanW» комментарий, который решал это:

«Две вещи я хотел бы предложить вам: Ширина измеряется в двухместном номере. Используйте Double вместо Decimal. Более важно: не возвращайте «значения» по умолчанию, так как он не возвращает действительное двойное значение, а не объект []. Это приведет к связыванию на провал»

Я просто должен был повернуть связывание значения и возвращаюсь в преобразователе двойных вместо десятичной

+0

Если ваша проблема решена, вы должны принять свой ответ – Shoe

+0

Я намерен, но два дня должны следовать, прежде чем я могу отметить свой собственный ответ как «Ответ» - еще два часа. –