diff --git a/shadowsocks-csharp/Localization/Strings.Designer.cs b/shadowsocks-csharp/Localization/Strings.Designer.cs
index 4534a9cf..6aa6738a 100644
--- a/shadowsocks-csharp/Localization/Strings.Designer.cs
+++ b/shadowsocks-csharp/Localization/Strings.Designer.cs
@@ -340,7 +340,7 @@ namespace Shadowsocks.Localization {
}
///
- /// Looks up a localized string similar to Timeout.
+ /// Looks up a localized string similar to Timeout (sec).
///
internal static string Timeout {
get {
diff --git a/shadowsocks-csharp/Localization/Strings.fr.resx b/shadowsocks-csharp/Localization/Strings.fr.resx
index be01a273..da708dd2 100644
--- a/shadowsocks-csharp/Localization/Strings.fr.resx
+++ b/shadowsocks-csharp/Localization/Strings.fr.resx
@@ -130,7 +130,7 @@
adresse
- Délai d'attente
+ Délai d'attente (sec)
Annuler
diff --git a/shadowsocks-csharp/Localization/Strings.ja.resx b/shadowsocks-csharp/Localization/Strings.ja.resx
index 4d8f997d..b47f5ba1 100644
--- a/shadowsocks-csharp/Localization/Strings.ja.resx
+++ b/shadowsocks-csharp/Localization/Strings.ja.resx
@@ -130,7 +130,7 @@
ポート
- タイムアウト
+ タイムアウト (秒)
キャンセル
diff --git a/shadowsocks-csharp/Localization/Strings.ko.resx b/shadowsocks-csharp/Localization/Strings.ko.resx
index 16df3925..65c899e4 100644
--- a/shadowsocks-csharp/Localization/Strings.ko.resx
+++ b/shadowsocks-csharp/Localization/Strings.ko.resx
@@ -130,7 +130,7 @@
포트
- 시간 초과
+ 시간 초과 (초)
취소
diff --git a/shadowsocks-csharp/Localization/Strings.resx b/shadowsocks-csharp/Localization/Strings.resx
index 17d6e307..9348c488 100644
--- a/shadowsocks-csharp/Localization/Strings.resx
+++ b/shadowsocks-csharp/Localization/Strings.resx
@@ -139,7 +139,7 @@
Port
- Timeout
+ Timeout (sec)
Credentials (optional)
diff --git a/shadowsocks-csharp/Localization/Strings.ru.resx b/shadowsocks-csharp/Localization/Strings.ru.resx
index 7c0ceb3d..ce007448 100644
--- a/shadowsocks-csharp/Localization/Strings.ru.resx
+++ b/shadowsocks-csharp/Localization/Strings.ru.resx
@@ -130,7 +130,7 @@
порт
- Таймаут
+ Таймаут (сек)
Отмена
diff --git a/shadowsocks-csharp/Localization/Strings.zh-Hans.resx b/shadowsocks-csharp/Localization/Strings.zh-Hans.resx
index 9ca554ed..f3ef9520 100644
--- a/shadowsocks-csharp/Localization/Strings.zh-Hans.resx
+++ b/shadowsocks-csharp/Localization/Strings.zh-Hans.resx
@@ -148,7 +148,7 @@
端口
- 超时
+ 超时 (秒)
确定
diff --git a/shadowsocks-csharp/Localization/Strings.zh-Hant.resx b/shadowsocks-csharp/Localization/Strings.zh-Hant.resx
index 91610dc5..e52f7e3f 100644
--- a/shadowsocks-csharp/Localization/Strings.zh-Hant.resx
+++ b/shadowsocks-csharp/Localization/Strings.zh-Hant.resx
@@ -130,7 +130,7 @@
位址
- 逾時
+ 逾時 (秒)
取消
diff --git a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs
index 2d9e9bb0..f901cac8 100644
--- a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs
+++ b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs
@@ -33,6 +33,9 @@ namespace Shadowsocks.ViewModels
Username = _config.proxy.authUser;
Password = _config.proxy.authPwd;
+ this.WhenAnyValue(x => x.NoProxy, x => !x)
+ .ToPropertyEx(this, x => x.CanModifyDetails);
+
AddressRule = this.ValidationRule(
viewModel => viewModel.Address,
address => !string.IsNullOrWhiteSpace(address),
@@ -73,6 +76,9 @@ namespace Shadowsocks.ViewModels
public ReactiveCommand Save { get; }
public ReactiveCommand Cancel { get; }
+ [ObservableAsProperty]
+ public bool CanModifyDetails { get; }
+
[Reactive]
public bool NoProxy { get; set; }
diff --git a/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs b/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs
index 362696f4..bc9a6658 100644
--- a/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs
+++ b/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs
@@ -40,6 +40,18 @@ namespace Shadowsocks.Views
viewModel => viewModel.Timeout,
view => view.timeoutTextBox.Text)
.DisposeWith(disposables);
+ this.OneWayBind(ViewModel,
+ viewModel => viewModel.CanModifyDetails,
+ view => view.addressTextBox.IsEnabled)
+ .DisposeWith(disposables);
+ this.OneWayBind(ViewModel,
+ viewModel => viewModel.CanModifyDetails,
+ view => view.portTextBox.IsEnabled)
+ .DisposeWith(disposables);
+ this.OneWayBind(ViewModel,
+ viewModel => viewModel.CanModifyDetails,
+ view => view.timeoutTextBox.IsEnabled)
+ .DisposeWith(disposables);
this.Bind(ViewModel,
viewModel => viewModel.Username,