Я не думаю, что вы можете изменить привязку динамически (по крайней мере, в XAML). Однако вы можете сделать следующее:
<StackPanel>
<ComboBox SelectedIndex="{Binding SelectedIndex}" Margin="2" Width="100">
<ComboBoxItem Tag="X">X</ComboBoxItem>
<ComboBoxItem Tag="Y">Y</ComboBoxItem>
</ComboBox>
<Slider Value="{Binding SliderValue}"></Slider>
</StackPanel>
Slider
теперь связано с другим свойством (SliderValue
). Вот дополнительные свойства вашей модели вида:
private int _selectedIndex;
public int SelectedIndex
{
get { return _selectedIndex; }
set
{
_selectedIndex = value;
NotifyPropertyChanged();
if (SelectedIndex == 0)
SliderValue = XValue;
else if (SelectedIndex == 1)
SliderValue = YValue;
}
}
private int _sliderValue;
public int SliderValue
{
get { return _sliderValue; }
set
{
_sliderValue = value;
NotifyPropertyChanged();
if (SelectedIndex == 0)
XValue = SliderValue;
else if (SelectedIndex == 1)
YValue = SliderValue;
}
}
Идея состоит в том, что когда SelectedItem
изменяется через ComboBox
, Slider
обновляется либо XValue
, либо [118 ]. Когда значение Slider
изменяется, значение XValue
или YValue
обновляется в зависимости от выбора ComboBox
.
Это не помогает Вам непосредственно, однако, соединения IMAP в JavaMail действительно поддерживают SASL (и таким образом CRAM-MD5, посмотрите Java документация SASL), если Вы устанавливаете mail.imap.sasl.enable
булево свойство к true
.
К сожалению, существует нет mail.smtp.sasl.enable
свойство и SASL не могут быть включены для SMTP в JavaMail.:-(
Однако можно загрузить исходный код JavaMail, и можно попытаться отредактировать код SMTP для поддержки SASL подобным образом к коду IMAP.Удачи!
import java.security.*;
class CRAMMD5Test
{
public static void main(String[] args) throws Exception
{
// This represents the BASE64 encoded timestamp sent by the POP server
String dataString = Base64Decoder.decode("PDAwMDAuMDAwMDAwMDAwMEBteDEuc2VydmVyLmNvbT4=");
byte[] data = dataString.getBytes();
// The password to access the account
byte[] key = new String("password").getBytes();
// The address of the e-mail account
String user = "client@server.com";
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.reset();
if (key.length > 64)
key = md5.digest(key);
byte[] k_ipad = new byte[64];
byte[] k_opad = new byte[64];
System.arraycopy(key, 0, k_ipad, 0, key.length);
System.arraycopy(key, 0, k_opad, 0, key.length);
for (int i=0; i<64; i++)
{
k_ipad[i] ^= 0x36;
k_opad[i] ^= 0x5c;
}
byte[] i_temp = new byte[k_ipad.length + data.length];
System.arraycopy(k_ipad, 0, i_temp, 0, k_ipad.length);
System.arraycopy(data, 0, i_temp, k_ipad.length, data.length);
i_temp = md5.digest(i_temp);
byte[] o_temp = new byte[k_opad.length + i_temp.length];
System.arraycopy(k_opad, 0, o_temp, 0, k_opad.length);
System.arraycopy(i_temp, 0, o_temp, k_opad.length, i_temp.length);
byte[] result = md5.digest(o_temp);
StringBuffer hexString = new StringBuffer();
for (int i=0;i < result.length; i++) {
hexString.append(Integer.toHexString((result[i] >>> 4) & 0x0F));
hexString.append(Integer.toHexString(0x0F & result[i]));
}
System.out.println(Base64Encoder.encode(user + " " + hexString.toString()));
}
}
Это, вероятно, не поможет, Вы, но CRAM-MD5 и CRAM-SHA1 довольно легки реализовать предположение, что у Вас есть корректная библиотека (md5/sha1) и, идеально, библиотека кодирования base64 (хотя материал base64 довольно легок реализовать себя в повышении).
Транзакция похожа на это:
C: AUTH CRAM-MD5
S: 334 BASE64(NONCE)
C: BASE64(USERNAME, " ", MD5((SECRET XOR opad),MD5((SECRET XOR ipad), NONCE)))
S: 235 Authentication succeeded
Где ДАННЫЙ СЛУЧАЙ однажды строка проблемы времени, ИМЯ ПОЛЬЗОВАТЕЛЯ является именем пользователя, которое Вы пытаетесь аутентифицировать, СЕКРЕТ является общим секретом ("пароль"), opad является 0x5C, и iPad является 0x36.
(CRAM-SHA1 был бы той же транзакцией, но использующий SHA1 () вместо MD5 (), чтобы сделать переваривание),
Так, вот пример реальной транзакции CRAM-MD5
C: AUTH CRAM-MD5
S: 334 PDQ1MDMuMTIyMzU1Nzg2MkBtYWlsMDEuZXhhbXBsZS5jb20+
C: dXNlckBleGFtcGxlLmNvbSA4YjdjODA5YzQ0NTNjZTVhYTA5N2VhNWM4OTlmNGY4Nw==
S: 235 Authentication succeeded
При резервном копировании процесса шаг Вы добираетесь:
S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com 8b7c809c4453ce5aa097ea5c899f4f87")
Резервное копирование одного шага вперед к перед обзором вычисляется, Вы добираетесь:
S: 334 BASE64("<4503.1223557862@mail01.example.com>")
C: BASE64("user@example.com ", MD5(("password" XOR opad),MD5(("password" XOR ipad), "<4503.1223557862@mail01.example.com>")))
Я предполагаю, что это довольно сбивает с толку теперь, когда я выписываю его, но доверяю мне, по сравнению с попыткой сделать NTLM/SPA вручную, это - бриз. Если Вы мотивированы, на самом деле довольно легко реализовать. Или возможно я только что потратил путь к долго с моими руками в кишках почтовых клиентов и серверов для размышления об этом ясно больше...
Изменение:
for (int i=0; i<result.length; i++)
hexString.append(Integer.toHexString(0xFF & result[i]));
Кому:
for (int i=0;i < result.length; i++) {
hexString.append(Integer.toHexString((result[i] >>> 4) & 0x0F));
hexString.append(Integer.toHexString(0x0F & result[i]));
}
Я попробовал код примера реальной транзакции CRAM-MD5, и также на примере, данном в RFC 2195.
Это не работает, потому что преобразование в шестнадцатеричную строку не корректно. Для экс-клена, с этим кодом, Вы получите "b913a62c7eda7a495b4e6e7334d3890" вместо "b913a602c7eda7a495b4e6e7334d3890", и отправленная строка аутентификации не будет корректна.
При загрузке исходного кода javaMail Вы будете видеть реализацию функции toHex в единицу "DigestMD5". Используя это преобразование, это будет работать.