2010-11-18 76 views
2

我在我的ViewModel中有一個名爲IsConnected的布爾屬性,我想將它綁定到我的MainWindow中的TextBlock。而不是讓文本塊讀取truefalse我需要它說ConnectedDisconnected。原諒我,因爲我是WPF的新手。如果有人能給我一個開始,我可以從那裏拿走它,但我不知道如何弄清楚我需要什麼。WPF數據綁定和格式化

回答

2

我一般寧願只是一個屬性添加到視圖模型(我真的不喜歡的值轉換器),但這裏有一個簡單的方法來完成你想使用樣式做什麼:

<TextBlock> 
    <TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Text" Value="Connected"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding IsConnected}" Value="False"> 
      <Setter Property="Text" Value="Disconnected"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
</TextBlock> 

編輯

需要注意的是,一旦你習慣使用數據觸發器,可以做出各種修改您的觀點不接觸你的視圖模型。例如:

<StackPanel> 
    <Image Source="images\connected.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsConnected}" Value="True"> 
       <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
    </Image> 
    <Image Source="images\disconnected.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsConnected}" Value="False"> 
       <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
    </Image> 
</StackPanel> 
+0

這似乎是解決問題的更好方法。我並不真的認爲轉換器是一個好主意。樣式看起來更合適,我不需要生成一個幫助屬性來生成字符串值。我寧願將我的ViewModel數據保存爲它想要的數據。 – jlafay 2010-11-19 14:07:26

+0

工作很好,並感謝圖像示例,因爲我想在我的視圖中爲另一個屬性做類似的事情。 – jlafay 2010-11-19 14:24:57

4

最簡單的方法可能是創建一個自定義轉換器,將您的bool值轉換爲字符串。在IValueConverter和/或WPF的任何位置搜索。

public class BoolToConnectedConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if((bool)value) 
      return "Connected"; 
     else 
      return "Disconnected"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

    #endregion 
} 

添加的xmlns:

xmlns:converter="clr-namespace:MyProjectNameSpace" 

附加資源XAML(可改變任何需要的元素)在XAML

<Window.Resources> 
    <converter:BoolToConnectedConverter x:Key="connectedConverter" /> 
</Window.Resources> 

<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" /> 
+0

請添加更多細節。 – ocodo 2010-11-18 22:24:13

+1

我要做的唯一變化就是從字符串資源文件中檢索文本。這樣你就可以使它成爲一個很好的通用'BoolToString'轉換器,並使用轉換器參數傳遞資源鍵的前綴以使用(前綴+ bool值==完整的密鑰,以便從資源中檢索字符串)。 – slugster 2010-11-18 22:34:48

+0

@slugster,我同意這一點。想了一會兒,但爲了簡單起見,爲了這個樣本而放棄了它。 – ThomasAndersson 2010-11-18 22:37:06

0

你可以在做到這一點兩種方式

1)寫一個轉換器

2)改變功能的視圖模型,使其返回所需的字符串,而不是一個布爾

最簡單的方法是#2,但如果你真的需要的布爾值在代碼中的其他地方,您可以使用#1(谷歌轉換器和wpf)

0

看看值轉換器。

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

public class BoolToConnectedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     var isConnected = (bool)value; 
     return isConnected ? "Connected" : "Disconnected"; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException("Not required for read-only values"); 
    } 
} 

在您的XAML:

<Window.Resources> 
    <l:BoolToConnectedConverter x:Key="boolToConnectedConverter" /> 
</Window.Resources> 
<Grid> 
    <Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" /> 
</Grid> 
1

使用視圖模型,你寫兩個屬性包裹,並通知在不動產的變化。

因此,無論何時更改值,字符串表示都會更新並綁定到控件,而您仍然可以在代碼中使用bool屬性。

public string IsConnectedStr{ 
    get{ 
    return IsConnected?"Connected":"Disconnected"; 
    } 
} 

public bool IsConnected{ 
    get{ 
    return _isConnected; 
    } 
    set{ 
    _isConnected=value; 
    PropertyChanged("IsConnected"); 
    PropertyChanged("IsConnectedStr"); 
    } 
}