У меня есть список, содержащий список строк в виде «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
Он не реализует INotifyPropertyChanged, потому что это не нужно. Я пытаюсь привязать значения txtRow и txtCol к свойствам Row и Col в классе DiePrintNav. INotifyPropertyChanged разрешит только изменения в программе DiePrintNav в текстовые поля. Я действительно хочу отразить то, что находится в текстовых полях, свойствам в DiePrintNav. Эти свойства Row и Col являются только для записи, так как нет необходимости извлекать эти данные вне класса. Я просто обновил исходное сообщение с помощью кода DiePrintNav. – kformeck
См. Обновление :) –
Я не могу понять, почему мне нужно реализовать метод ConvertBack. Я поставил точку останова там, и независимо от того, что я делаю, я не могу запустить этот метод. Если текстовые поля строки и столбца привязаны к выбранному значению свойства списка, а свойства строки и столбца класса DiePrintNav привязаны к текстовым полям строки и столбца, я не вижу, как когда-либо понадобится ConvertBack. – kformeck