Вызвать ConvertBack IValueConverter при загрузке - PullRequest
0 голосов
/ 22 июня 2011

Я связываю комбинированный список (который является частью шаблона элемента списка) с перечислением, выбранный элемент привязывается к коллекции, которая связана со списком.
Я использую конвертер для некоторой логики.

Проблема в том, что ConvertBack не вызывается при запуске, а только когда я повторно выбираю элемент в выпадающем списке.

Мне нужно, чтобы он также вызывался при старте.

public enum FullEnum 
    {
       Apple,
       Banana,
       Pear
    }
<Window.Resources>
   <local:EnumConverter x:Key="enumConverter"/>

   <ObjectDataProvider x:Key="DataT"
                       MethodName="GetValues" 
                       ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:FullEnum" />
            </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<Grid>
   <Grid.RowDefinitions>
        <RowDefinition Height="190*" />
       <RowDefinition Height="71*" />
   </Grid.RowDefinitions>
   <ListBox Name="list1" Margin="0,0,0,37">
        <ListBox.ItemTemplate>
           <DataTemplate>
             <StackPanel>
               <TextBlock Text="{Binding Path=Label}"></TextBlock>
               <ComboBox Height="23" Width="90"                                 
                         ItemsSource="{Binding Source={StaticResource DataT}}"                                                                  
                         SelectedValue="{Binding Path=Oped, Converter={StaticResource enumConverter}}">
                </ComboBox>
             </StackPanel>
          </DataTemplate>
        </ListBox.ItemTemplate>
      </ListBox>
  </Grid>
List<Item1> list = new List<Item1>();
public Window1()
{
     InitializeComponent();
     list.Add(new Item1 { Label="label1" });
     list.Add(new Item1 { Label = "label2" });
     list.Add(new Item1 {  Label = "label3" });

     list1.ItemsSource = list;

}

    public class Item1
    {
            public FullEnum Oped { get; set; }
            public string Label { get; set; }
    }

 public class EnumConverterr : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            //some code        
        }

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((int)value != 0)
            return (EnumSuperior)value;
        return (EnumSuperior)7;
    }

    }

1 Ответ

0 голосов
/ 22 июня 2011

Конвертер возврата не вызывается WPF при инициализации, поскольку он только что получил начальные значения из контекста данных. Источник и цель привязки данных должны иметь одинаковые значения, поэтому нет необходимости обновлять источник.

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

Если ваш преобразователь не имеет состояния, все, что вам нужно сделать, это правильно инициализировать источник данных, и вам больше не нужен этот первоначальный обратный вызов преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...