2016-07-27 48 views
0

以下の問題を解決する方法を見つけることを試みる。子要素条件からの親要素のDataTriggerへの方法

私の目標は です。ボタンの子要素の中にはテキストが含まれていないものがある場合は、親ボタンを無効にします。

だから、私はをしようとしているまさに:

<Button Style="{StaticResource ButtonStyle}" > 
      <TextBlock> 
       <Run Name="TxtElement1" Text=""/> 
      </TextBlock> 
     </Button> 

<Button Style="{StaticResource ButtonStyle}" > 
      <TextBlock> 
       <Run Name="TxtElement2" Text="some text 1"/> 
      </TextBlock> 
     </Button> 

<Button Style="{StaticResource ButtonStyle}" > 
      <TextBlock> 
       <Run Name="TxtElement3" Text="some text 2"/> 
      </TextBlock> 
     </Button> 

今すぐトリガーとスタイルを作成:

<Style x:Key="ButtonStyle" TargetType="Button"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding ElementName=TxtElement1, Path=Text}" Value=""> 
      <Setter Property="IsEnabled" Value="False" /> 
      </DataTrigger> 

      <DataTrigger Binding="{Binding ElementName=TxtElement2, Path=Text}" Value=""> 
      <Setter Property="IsEnabled" Value="False" /> 
      </DataTrigger> 

      <DataTrigger Binding="{Binding ElementName=TxtElement3, Path=Text}" Value=""> 
      <Setter Property="IsEnabled" Value="False" /> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

だから、私が得た結果に

は、ボタンを作成します。 すべてのToggleButtonsは無効にされます。 しかし、私はボタンを無効にする必要があります実行子要素のプロパティテキストが空の場合

多分私は根本的に間違ったアプローチを使用しています。

+0

Tbh、これはまったく意味がありません...なぜあなたはこのようなボタンのスタイルを設定しますか?ボタンの 'Content'を使用して自己バインドを行います – lokusking

+0

私の場合は、ボタンコンテンツのソースをほとんど使用していません。' 「 –

+0

いいえ。よかったね。それは本当に奇妙で、このことはうまくいかないという事実は変わっていません。スタイルは**あなたのボタンの前に定義されているため、ボタンのコンテンツについての知識はありません(単純なテキストの場合は実際に使用する必要があります)。回避策は、「ControlTemplate」またはBehaviorまたはCodeBehindです。しかし、プレーンXAMLを使用すると、悪い時間がかかるでしょう – lokusking

答えて

0

私は物事を複雑にしないことをお勧めします。データはデータを設定する前にボタンに適用されます。 VMSourceをボタンのコンテンツプロパティに直接バインドします。そして、有効/無効、この場合には(いくつかの操作を行うにはLoadedイベントを使用します。以下のチョキを参照してください。以下は

<Button Loaded="Button_Loaded" Content="" /> 
<Button Loaded="Button_Loaded" Content="some text 1" /> 
<Button Loaded="Button_Loaded" Content="some text 2"/> 

あなたButton_Loadedイベントになります。

private void Button_Loaded(object sender, RoutedEventArgs e) 
{ 
    Button _button = (Button)sender; 
    if (string.IsNullOrEmpty(_button.Content.ToString())) 
     _button.IsEnabled = false; 
} 

ロードされたが、テキストが更新された後にのみ起動されますので、何のコンテンツが存在しないので、あなたは常にボタンが無効になって表示されます。

幸運を。

0

男うわー...あなたは本当に私の脳のスモーキーを得た。

私は本当に醜い解決策を見つけました。それは、あなたの頑固な願いをRunで処理するかもしれません。

XAML

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self} , Path=Content, Converter={StaticResource Converter}, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

コンバータ

public class MyConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (value == null) return true; //No Content at all 
      var block = value as TextBlock;    
      if (block != null) 
      { 
       block.Loaded += (sender, args) => //Inlines are only availilable if Control has loaded 
       { 
        var loadedBlock = sender as TextBlock; 
        var inlineCount = loadedBlock.Inlines.Count == 0; 
        if (!inlineCount) 
        { 
         var runs = loadedBlock.Inlines.OfType<Run>(); 
         foreach (var run in runs.Where(run => !string.IsNullOrEmpty(run.Text))) 
         { 
          (loadedBlock.Parent as Button).IsEnabled = true; 
         } 
        } 
       }; 
       return string.IsNullOrEmpty(block.Text); 
      } 
      return false; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

使用

<Button Content="Click me" Width="80" Height="20" Style="{StaticResource ButtonStyle}"/> 
    <Button Width="80" Height="20" Style="{StaticResource ButtonStyle}"/> 
    <Button Width="80" Height="20" Style="{StaticResource ButtonStyle}"> 
       <TextBlock Foreground="Red"> 
        <Run Name="TxtElement3" Text="some text 2"/> 
       </TextBlock> 
      </Button> 
    <Button Width="80" Height="20" Style="{StaticResource ButtonStyle}" > 
       <TextBlock> 
        <Run Text=""/> 
       </TextBlock> 
      </Button> 
    <Button Width="80" Height="20" Style="{StaticResource ButtonStyle}" > 
       <TextBlock> 
        <Run Text=""/> 
        <Run Text="Some other Text"></Run> 
       </TextBlock> 
      </Button> 

IMPOPRANTANT

非常に! このソリューションを使用しないでください(それでも機能します)。 ボタンのコンテンツを使用し、プレーンテキストだけの場合は、そこにあなたのものを入れてください。

関連する問題