как передать значение в конвертер, который является свойством в элементе, который был связан - PullRequest
1 голос
/ 07 марта 2012

У меня есть группа фигур, мне нужно решить, какие из них остаются видимыми, а какие скрытыми. в соответствии с условиями буксировки (это будет визуальная игра в кости)

(1) значение, которое они получают посредством привязки из контекста данных.

(2) значение их места в группе, которое я сохранил для каждой фигуры в свойстве Tag

Мне нужен конвертер, чтобы получить свойство тега в качестве параметра для каждой фигуры

моя привязка :( НЕПРАВИЛЬНО)

 <Style TargetType="{x:Type Ellipse}">
    <Setter Property="Visibility" Value="{Binding Path=., Converter={StaticResource MyDiceInputToVisualConverter}}"></Setter>
 </Style>

Мои фигуры:

 <Canvas DataContext="{Binding Path=DataContext.Dice1,RelativeSource={RelativeSource AncestorType=StackPanel}}">
      <Ellipse Tag="1" Canvas.Left="5" Canvas.Top="5"></Ellipse>
      <Ellipse Tag="2" Canvas.Left="5" Canvas.Top="20"></Ellipse>
      <Ellipse Tag="3" Canvas.Left="5" Canvas.Top="35"></Ellipse>
      <Ellipse Tag="4" Canvas.Left="20" Canvas.Top="20"></Ellipse>
      <Ellipse Tag="5" Canvas.Left="35" Canvas.Top="5"></Ellipse>
      <Ellipse Tag="6" Canvas.Left="35" Canvas.Top="20"></Ellipse>
      <Ellipse Tag="7" Canvas.Left="35" Canvas.Top="35"></Ellipse>
   </Canvas>

мой конвертер не должен представлять интереса, все, что он делает, это возвращает видимость или скрыт стоимость кости и место Точки на кости.

есть идеи, как отправить конвертеру свойство тега или, в качестве альтернативы, указать его в конвертере?

спасибо заранее.

РЕДАКТИРОВАТЬ:

В итоге я явно установил привязку в разметке каждого эллипса:

<Canvas DataContext="{Binding Path=DataContext.Dice1,RelativeSource={RelativeSource AncestorType=StackPanel}}">
     <Ellipse Tag="1" Canvas.Left="5" Canvas.Top="5" Visibility="{Binding Path=., Converter={StaticResource MyDiceInputToVisualConverter},ConverterParameter=1}"></Ellipse>
     <Ellipse Tag="2" Canvas.Left="5" Canvas.Top="20" Visibility="{Binding Path=., Converter={StaticResource MyDiceInputToVisualConverter},ConverterParameter=2}"></Ellipse>
     <Ellipse Tag="3" Canvas.Left="5" Canvas.Top="35" Visibility="{Binding Path=., Converter={StaticResource MyDiceInputToVisualConverter},ConverterParameter=3}"></Ellipse>
 </Canvas> 

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

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Я думаю, вам нужен мульти-связывание:

<Page.Resources>
    <WPFSampleExplorer:MyDiceInputToVisualConverter x:Key="MyDiceInputToVisualConverter" />
    <Style TargetType="{x:Type Ellipse}">
        <Setter Property="Visibility">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource MyDiceInputToVisualConverter}">
                    <Binding RelativeSource="{RelativeSource Self}" Path="Tag"/>
                    <Binding />
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

<Page.DataContext>
    <Samples:DiceViewModel/>
</Page.DataContext>

<Canvas>
    <Ellipse Tag="1" Canvas.Left="5" Canvas.Top="5" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="2" Canvas.Left="5" Canvas.Top="20" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="3" Canvas.Left="5" Canvas.Top="35" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="4" Canvas.Left="20" Canvas.Top="20" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="5" Canvas.Left="35" Canvas.Top="5" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="6" Canvas.Left="35" Canvas.Top="20" Width="20" Height="20" Fill="Yellow"></Ellipse>
    <Ellipse Tag="7" Canvas.Left="35" Canvas.Top="35" Width="20" Height="20" Fill="Yellow"></Ellipse>
</Canvas>

public class DiceViewModel
{
    // properties here
}

public class MyDiceInputToVisualConverter : IMultiValueConverter
{
    #region Implementation of IMultiValueConverter

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        Debug.WriteLine(values[0]);  // This outputs 1,2,3,..7
        Debug.WriteLine(values[1]);  // This is your DiceViewModel

        return Visibility.Visible;
    }

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

    #endregion
}
0 голосов
/ 07 марта 2012

Если вы опустите параметр ConverterParameter, ваш конвертер получит полный объект (эллипс). Затем выполните приведение своего значения к эллипсу и получите свой тег.

...