2016-06-08 51 views
0

好的開放式問題!代碼實踐:比較代碼隱藏中的視圖標籤?

所以我已經在我的公司中看到了這樣一段代碼。這不是最好的做法,但我看到這麼頻繁:

<RadioButton Checked="ToggleButton_OnChecked">商品標價籤 85* 38mm</RadioButton> 
<RadioButton Checked="ToggleButton_OnChecked">商品標價籤 95* 38mm</RadioButton> 
<RadioButton Checked="ToggleButton_OnChecked">單排40*30mm</RadioButton> 
<RadioButton Checked="ToggleButton_OnChecked">雙排40*25mm</RadioButton> 

所有這些都是好的,但看在事件處理程序我找到一個代碼異味:

var obj = (string)radio.Content; 
PaperSizeColumns = 1; 
switch (obj.Trim()) 
{ 
    case "58mm": 
     DocumentWidth.Text = "58"; 
     DocumentHeight.Text = "NaN"; 
     break; 
    case "80mm": 
     DocumentWidth.Text = "80"; 
     DocumentHeight.Text = "NaN"; 
     break; 
    case "商品標價籤 85* 38mm": 
     DocumentWidth.Text = "85"; 
     DocumentHeight.Text = "38"; 
     break; 
    case "商品標價籤 95* 38mm": 
     DocumentWidth.Text = "80"; 
     DocumentHeight.Text = "38"; 
     break; 
    case "單排40*30mm": 
     DocumentWidth.Text = "40"; 
     DocumentHeight.Text = "30"; 
     break; 
    case "雙排40*22mm": 
     DocumentWidth.Text = "85"; 
     DocumentHeight.Text = "23"; 
     PaperSizeColumns = 2; 
     break; 
} 

我也許可以想出的原因,一打,這是餿主意。但我幾乎不能說這是一個相當不錯的快速方法,除了幾個收音機外幾乎需要零設置,而且你還是很適合去。

我在想一個更好的方法來做到這一點。我的第一個猜測是設置DataContext,但它是動態類型的,很難解決可維護性的問題。

那麼處理這件事的好方法是什麼,我可以教我的同事。因爲如果工作流程太繁重,他會忽略建議。

+1

因爲這是工作代碼,它可能是更適合於[codereview.se] 。 –

+0

這個_is_非常開放。你想以某種方式縮短代碼嗎?消除使用用戶看到的字符串,這很容易改變並打破開關語句?採用更多MVVM方法? @Cᴏʀʏ是正確的,但工作代碼可能更適合於代碼審查。但是你仍然想要明確你想要改進的東西。 –

+0

我可能會去與XMLDataProvider。這將向他們介紹'適當的'數據對象或MVVM。 – tgpdyk

回答

1

可能的方法:

步驟1:聲明一個數據項

public class Element 
{ 
    public string Name { get; set; } 
    public string Width { get; set; } 
    public string Height { get; set; } 
    public int Columns { get; set; } 
} 

步驟2:

創建該數據項的模板,並使用該模板在單選按鈕。單選按鈕有數據項的內容

<StackPanel> 
    <StackPanel.Resources> 
     <DataTemplate x:Key="E" DataType="local:Element"> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 

     <Style TargetType="RadioButton"> 
      <Setter Property="ContentTemplate" Value="{StaticResource E}"/> 
      <EventSetter Event="Checked" Handler="ToggleButton_OnChecked"/> 
     </Style> 
    </StackPanel.Resources> 

    <RadioButton> 
     <local:Element Name="40*30mm" Width="40" Height="30" Columns="1"/> 
    </RadioButton> 

    <RadioButton> 
     <local:Element Name="40*25mm" Width="40" Height="25" Columns="1"/> 
    </RadioButton> 

    <RadioButton> 
     <local:Element Name="35*25mm" Width="35" Height="25" Columns="1"/> 
    </RadioButton> 
</StackPanel> 

第3步:

使用的數據項,當手柄經過事件

private void ToggleButton_OnChecked(object sender, RoutedEventArgs e) 
{ 
    var rdo = sender as RadioButton; 
    Element x = rdo.Content as Element; 
    // do smth with selected Element 
}