2013-03-13 2 views
1

У меня есть список, содержащий список строк в виде «02x06» .. всегда двузначное число, строчный x, двухзначное число без пробелов. Это связано с двумя текстовыми полями: одна содержит строку (в этом случае - 02), а другая - столбец (06).MultiBinding текстовое поле не обновляет исходное свойство

Это прекрасно работает.

Теперь мне нужно привязать текстовое поле строки к свойству Row в коде и текстовому полю col для свойства Col в коде. Я пытаюсь сделать это с помощью MultiBinding:

XAML:

<Windows.Resources> 
    <local:DiePrintConverter x:Key="DiePrintConverter"/> 
</Window.Resources> 
<ListBox 
    Name="lbxUninspectedPrints" 
    ItemsSource="{Binding UninspectedPrintList}" 
    Margin="5" 
    Background="MidnightBlue"/> 
<TextBox 
    Name="txtCol" 
    Style="{StaticResource txtStyle}"> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource DiePrintConverter}"> 
      <Binding 
       Path="SelectedValue" 
       ConverterParameter="1" 
       ElementName="lbxUninspectedPrints" 
       Mode="OneWay"/> 
      <Binding 
       Path="Col" 
       Mode="OneWayToSource"/> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 
<TextBox 
    Name="txtRow" 
    Style="{StaticResource txtStyle}"> 
    <TextBox.Text> 
     <MultiBinding Converter="{StaticResource DiePrintConverter}"> 
      <Binding 
       Path="SelectedValue" 
       ConverterParameter="0" 
       ElementName="lbxUninspectedPrints" 
       Mode="OneWay"/> 
      <Binding 
       Path="Row" 
       Mode="OneWayToSource"/> 
     </MultiBinding> 
    </TextBox.Text> 
</TextBox> 

Код За:

lbxUninspectedPrints.DataContext = wtw; 
txtRow.DataContext = wtw.DiePrintNav; 
txtCol.DataContext = wtw.DiePrintNav; 

DiePrintConverter класса:

public class DiePrintConverter : IMultiValueConverter 
{ 
    bool row = true; 
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value[0] == null) 
     { 
      return "00"; 
     } 

     var values = value[0].ToString().Split(new string[] { "x" }, StringSplitOptions.None); 

     int x = 0; 
     for (int i = 0; i < values.Count(); i++) 
     { 
      if (values[i].ToString().Count() == 1) 
      { 
       values[i] = "0" + values[i]; 
      } 
     } 
     if (row) 
     { 
      row = false; 
      return values[0].ToString(); 
     } 
     else 
     { 
      row = true; 
      return values[1].ToString(); 
     } 
     return "00"; 
    } 

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

DiePrintNavigation Класс:

public class DiePrintNavigation 
{ 
#region Fields 

    private string row; 
    private string col; 
    private DiePrint diePrint; 
    private DelegateCommand moveUpCommand; 
    private DelegateCommand moveDownCommand; 
    private DelegateCommand moveLeftCommand; 
    private DelegateCommand moveRightCommand; 
    private DelegateCommand loadMapCommand; 
    private WaferTrackerWindowViewModel wtw; 

#endregion 

#region Constructor 

    public DiePrintNavigation() { } 
    public DiePrintNavigation(WaferTrackerWindowViewModel wtw) 
    { 
     this.wtw = wtw; 
    } 

#endregion 

#region Properties 

    public string Row 
    { 
     set 
     { 
      row = value; 
     } 
    } 
    public string Col 
    { 
     set 
     { 
      col = value; 
     } 
    } 
    public DiePrint DiePrint 
    { 
     get 
     { 
      return diePrint; 
     } 
     set 
     { 
      diePrint = value; 
     } 
    } 
    public ICommand MoveUpCommand 
    { 
     get 
     { 
      if (moveUpCommand == null) 
      { 
       moveUpCommand = new DelegateCommand(MoveUp); 
      } 
      return moveUpCommand; 
     } 
    } 
    public ICommand MoveDownCommand 
    { 
     get 
     { 
      if (moveDownCommand == null) 
      { 
       moveDownCommand = new DelegateCommand(MoveDown); 
      } 
      return moveDownCommand; 
     } 
    } 
    public ICommand MoveLeftCommand 
    { 
     get 
     { 
      if (moveLeftCommand == null) 
      { 
       moveLeftCommand = new DelegateCommand(MoveLeft); 
      } 
      return moveLeftCommand; 
     } 
    } 
    public ICommand MoveRightCommand 
    { 
     get 
     { 
      if (moveRightCommand == null) 
      { 
       moveRightCommand = new DelegateCommand(MoveRight); 
      } 
      return moveRightCommand; 
     } 
    } 
    public ICommand LoadMapCommand 
    { 
     get 
     { 
      if (loadMapCommand == null) 
      { 
       loadMapCommand = new DelegateCommand(LoadMap); 
      } 
      return loadMapCommand; 
     } 
    } 

#endregion 

#region Methods 

    private void Move() 
    { 
     DiePrintQueries diePrintQueries = new DiePrintQueries(
      DataLibrary.SingulationOne, 
      DataLibrary.MasksInfo); 
     diePrint.Name = diePrint.Row.ToString() + "x" + diePrint.Col.ToString(); 
     try 
     { 
      diePrint.Mask = diePrintQueries.GetMask(diePrint.Name); 
      diePrint.LasersPerDie = diePrintQueries.GetLasersPerDie(diePrint.Mask); 
      diePrint.DieTable = diePrintQueries.GetListOfDie(diePrint.Name); 
      wtw.WaferMap.DiePrint = diePrint; 
      wtw.WaferMap.DrawMap(); 
     } 
     catch (InvalidOperationException) 
     { 
      MessageBox.Show(
       "Die Print " + diePrint.Name + " does not exist on this wafer.\n" + 
       "Please move to a die print that exists.", 
       "Non-Existent Die Print", MessageBoxButton.OK, MessageBoxImage.Error); 
     } 
    } 
    public void MoveUp() 
    { 
     // TODO: Catch all these Move Errors!!! 
     try 
     { 
      diePrint.GetRowAndColumn(diePrint.Name); 
      diePrint.Row = diePrint.Row - 1; 
      Move(); 
     } 
     catch (NullReferenceException) 
     { 
     } 
    } 
    public void MoveDown() 
    { 
     diePrint.GetRowAndColumn(diePrint.Name); 
     diePrint.Row = diePrint.Row + 1; 
     Move(); 
    } 
    public void MoveRight() 
    { 
     diePrint.GetRowAndColumn(diePrint.Name); 
     diePrint.Col = diePrint.Col + 1; 
     Move(); 
    } 
    public void MoveLeft() 
    { 
     diePrint.GetRowAndColumn(diePrint.Name); 
     diePrint.Col = diePrint.Col - 1; 
     Move(); 
    } 
    public void LoadMap() 
    { 
     if (diePrint == null) 
     { 
      DiePrintQueries diePrintQueries = new DiePrintQueries(
       DataLibrary.SingulationOne, 
       DataLibrary.MasksInfo); 
      if (this.row.StartsWith("0")) 
      { 
       row = row.Remove(0, 1); 
      } 
      if (this.col.StartsWith("0")) 
      { 
       col = col.Remove(0, 1); 
      } 
      diePrint = new DiePrint(this.row + "x" + this.col); 
      diePrint.Mask = diePrintQueries.GetMask(diePrint.Name); 
      diePrint.DieTable = diePrintQueries.GetListOfDie(diePrint.Name); 

      // TODO: dupCode(1) 
      // Then map the die print 
      wtw.WaferMap = new DiePrintMapViewModel(diePrint); 
      wtw.WaferMap.NotifyCanvas += wtw.Update; 
      wtw.WaferMap.NotifyBluetape += wtw.Update; 
      wtw.WaferMap.NotifyDieprint += wtw.Update; 
      wtw.WaferMap.DrawMap(); 
      wtw.FailureCodeManager.DiePrintMap = (DiePrintMapViewModel) wtw.WaferMap; 
     } 
     diePrint.Row = Convert.ToInt32(this.row); 
     diePrint.Col = Convert.ToInt32(this.col); 
     Move(); 
    } 

#endregion 
} 

wtw - это модель для окна, содержащего все эти компоненты. DiePrintNav - это класс, который содержит свойства Row и Col для записи только тех свойств, которые необходимо обновить при изменении значений txtRow и txtCol. Объект модели wtw view содержит свойство DiePrintNav и представляет собой контекст данных текстовых полей. Контекст данных окна списка неизолированных принтов также является объектом wtw и привязан к свойству UninspectedPrintList wtw.

Поле списка заполнено правильно. Затем я могу щелкнуть все что угодно в окне списка, и оно зеркально отражается на txtRow и txtCol, также отлично, поэтому класс IMultiValueConverter работает правильно.

Проблема в том, что всякий раз, когда что-либо изменяется в txtRow и txtCol, их соответствующие свойства не обновляются.

Что происходит?

Любая помощь будет принята с благодарностью!

Спасибо,

Kyle

ответ

0

Может быть, ваш класс DiePrintNav обязательных для implemente INotifyPropertyChanged интерфейса. Имеет ли это? Это может быть причиной. Проверьте это, пожалуйста.

EDIT


теперь я понимаю, вы хотите обновить свойства модели из вида. Кажется, что проблема заключается в том, что вам нужно определить метод ConvertBack вашего MultiValueConverter, таким образом, представление сможет обновлять все свойства при его изменении. Другое дело, что привязка должна быть Mode=TwoWay, потому что, даже если вы не хотите обновлять представление из модели, в первый раз, когда вы загружаете модель, вам может потребоваться, чтобы представление отображало старые значения модели в в этом случае требуется двусторонняя привязка. Надеюсь, это обновление поможет ...

EDIT


Пожалуйста, проверьте MSDN IMultivalueConverter Interface статью, здесь объясняет то, как интерфейс работает IMultivalueConverter, надежда помогает :)

+0

Он не реализует INotifyPropertyChanged, потому что это не нужно. Я пытаюсь привязать значения txtRow и txtCol к свойствам Row и Col в классе DiePrintNav. INotifyPropertyChanged разрешит только изменения в программе DiePrintNav в текстовые поля. Я действительно хочу отразить то, что находится в текстовых полях, свойствам в DiePrintNav. Эти свойства Row и Col являются только для записи, так как нет необходимости извлекать эти данные вне класса. Я просто обновил исходное сообщение с помощью кода DiePrintNav. – kformeck

+0

См. Обновление :) –

+0

Я не могу понять, почему мне нужно реализовать метод ConvertBack. Я поставил точку останова там, и независимо от того, что я делаю, я не могу запустить этот метод. Если текстовые поля строки и столбца привязаны к выбранному значению свойства списка, а свойства строки и столбца класса DiePrintNav привязаны к текстовым полям строки и столбца, я не вижу, как когда-либо понадобится ConvertBack. – kformeck