如果你想使用RadioButton,你只需做一些小的調整來解決RadioButton的默認行爲。
您需要解決的第一個問題是基於它們的通用直接父容器自動對RadioButton進行分組。既然你不喜歡「GroupName」破解你的另一種選擇是將每個RadioButton放在它自己的Grid或其他容器中。這將使每個按鈕成爲其自己組的成員,並會強制他們根據其IsChecked綁定行爲。
<StackPanel Orientation="Horizontal">
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Idle}">Idle</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Active}">Active</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Disabled}">Disabled</RadioButton>
</Grid>
<Grid>
<RadioButton IsChecked="{Binding Path=CurrentMode, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Running}">Running</RadioButton>
</Grid>
</StackPanel>
這使我想到這是確保點擊它後的按鈕點擊不留其選中狀態下一個解決方法這是必要的,以觸發集合調用,因爲你是在裝訂器isChecked屬性。您需要發送一個額外的NotifyPropertyChanged,但它必須被推入調度線程的隊列中,以便該按鈕將接收通知並更新其可視化IsChecked綁定。添加到您的視圖模型類,這可能是替換現有的NotifyPropertyChanged實現和我假設你的類實現它在問題的代碼所缺少的INotifyPropertyChanged的:
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
Dispatcher uiDispatcher = Application.Current != null ? Application.Current.Dispatcher : null;
if (uiDispatcher != null)
{
uiDispatcher.BeginInvoke(DispatcherPriority.DataBind,
(ThreadStart)delegate()
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
});
}
}
}
在CURRENTMODE的二傳手呼籲NotifyPropertyChanged
然後(「CURRENTMODE 「)。您可能已經需要類似這樣的事情,因爲您的服務器的ModeChanged調用可能是在不是Dispatcher線程的線程中進入的。
最後,如果您希望它們具有不同的Checked/Unchecked外觀,您將需要將樣式應用於您的RadioButtons。快速谷歌搜索WPF RadioButton ControlTemplate最終出現在這個網站:http://madprops.org/blog/wpf-killed-the-radiobutton-star/。