2011-04-18 113 views
2

在WPF中,我有一個堆棧面板,其項目控件定義了一個數據模板。這個數據模板是一個單選按鈕。項目源是我的視圖模型上的一個名稱集合。WPF單選按鈕選定的值命令綁定

因此,對於視圖模型中的每個名稱,堆棧面板上會出現一個單選按鈕,其旁邊的文本顯示該名稱(使用content屬性)。

所有這些單選按鈕都將組設置爲「名稱」,因此選擇是互斥的。

我的問題是,我有什麼選擇將所選單選按鈕的內容綁定到我的視圖模型「selectedName」上的屬性?

理想情況下,我想要一個UI綁定,即無代碼。

Thankyou

回答

1

我不確定您是否可以在沒有任何事件處理的情況下利用互斥性。通常我有MenuItems或按鈕組的問題,我的方法是使用一個EqualityConverter的Multibindings,例如

<Setter Property="IsChecked"> 
    <Setter.Value> 
     <MultiBinding Converter="{StaticResource EqualityComparisonConverter}" Mode="OneWay"> 
      <!-- This binding should find your VM and bind to your property --> 
      <Binding RelativeSource="{RelativeSource AncestorType=Window}" 
        Path="DataContext.SelectedName"/> 

      <!-- Binds to the item being templated --> 
      <Binding /> 
     </MultiBinding> 
    </Setter.Value> 
</Setter> 

A轉換器(它不是很安全,會拋出異常,如果其中一個值是零,可能要提高它):

public class EqualityComparisonConverter : IMultiValueConverter 
{ 
    #region IMultiValueConverter Members 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Length < 2) throw new Exception("At least two inputs are needed for comparison"); 
     bool output = values.Aggregate(true, (acc, x) => acc && x.Equals(values[0])); 
     return output; 
    } 

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

    #endregion 
} 

其實這是有點神祕的對我怎麼樣,即使作品(考慮結合是單向的)...

1

您可以爲每個RadioButton創建一個ViewModel。它應該公開屬性來綁定RadioButton的Checked和一些事件來通知主ViewModel關於它。

+0

想過這個,但不是我最喜歡的選項 – nick 2011-04-18 17:16:44

1

您可能會發現此鏈接有用,提出一個解決問題的方法,但不幸的是它不是無代碼:

http://www.wpftutorial.net/RadioButton.html

正如文章所述,在radioButton上存在數據綁定的問題...所以我們開發人員必須努力才能使其工作!