WPF绑定似乎不起作用,但我没有在输出窗口中收到任何错误消息

时间:2011-07-22 16:17:01

标签: wpf binding custom-controls modal-dialog

我的主窗口打开了一个对话框。除此之外,它还有一个我编写的自定义控件,可以控制程序中任何MediaElement控件的音量。

音量控制包含2个按钮和一个ProgressBar。它有一个Volume DependencyProperty。单击音量增大按钮时,Volume属性的值增加5%;同样,单击音量减小按钮可将音量降低5%。这反映在ProgressBar中。我对ProgressBar的工作有信心,但我不会排除那里的问题。

该对话框有自己的Volume DependencyProperty,就像主窗口一样。我试图将Dialog中Volume控件的Volume属性绑定到对话框的Volume属性。我甚至在对话框中添加了一个文本字段,告诉我Volume属性的值是什么。我想我需要这个以确保对话框的音量确实在变化。它似乎根本没有改变。

这是对话框的xaml的摘录。它遗漏了一些与此问题无关的事情。

<Window x:Class="CarSystem.SettingsDialog" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:c="clr-namespace:CarSystem"
        xmlns:cs="clr-namespace:CarSystem.CustomControls;assembly=CustomControls" 
        Closed="SettingsDialog_Closed"
        Height="300" 
        ResizeMode="NoResize" 
        Title="Settings" 
        Width="550" 
        WindowStartupLocation="CenterOwner" 
        WindowStyle="None">

    <StackPanel>

        <StackPanel Grid.Column="2" Orientation="Horizontal">
            <TextBlock FontSize="20" 
                       FontWeight="Bold" 
                       Foreground="White" 
                       Margin="10" 
                       Text="Volume: " 
                       VerticalAlignment="Center" />
            <TextBlock FontSize="20" 
                       FontWeight="Bold" 
                       Foreground="White" 
                       Margin="10" 
                       Text="{Binding Mode=OneWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" 
                       VerticalAlignment="Center" />
        </StackPanel>

        <StackPanel>

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <cs:VolumeControl Grid.Row="0" 
                              Height="60" 
                                  HorizontalAlignment="Left" 
                                  Margin="20,0,0,0" 
                                  Volume="{Binding Mode=OneWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" 
                                  Width="325" />

                <Button Background="#FF3C4B66" 
                        Click="CloseButton_Click" 
                        Content="Close" 
                        FontSize="20" 
                        FontWeight="Bold" 
                        Foreground="White" 
                        Grid.Row="1" 
                        Height="50"
                        HorizontalAlignment="Right" 
                        Margin="0,5,20,5" 
                        Width="125" />
                </Grid>
            </StackPanel>
        </Border>

    </StackPanel>

</Window>

以下是音量控制的代码隐藏:

public partial class VolumeControl : Control {

    public static readonly DependencyProperty VolumeProperty = 
        DependencyProperty.Register( "Volume", typeof( double ), typeof( VolumeControl ), new FrameworkPropertyMetadata( 0.50 ) );

    public double Volume {
        get { return (double) GetValue( VolumeProperty ); }
        set { SetValue( VolumeProperty, value ); }
    }

    public VolumeControl() {
        Loaded += WasLoaded;
    }

    static VolumeControl() {
        DefaultStyleKeyProperty.OverrideMetadata( typeof( VolumeControl ), new FrameworkPropertyMetadata( typeof( VolumeControl ) ) );
    }

    private void VolumeDown_Click( object sender, RoutedEventArgs e ) {
        Volume = Math.Max( 0, Volume - 0.05 );
    }

    private void VolumeUp_Click( object sender, RoutedEventArgs e ) {
        Volume = Math.Min( 1.0, Volume + 0.05 );
    }

    private void WasLoaded( object sender, EventArgs e ) {
        RepeatButton VolumeUpButton = (RepeatButton) Template.FindName( "PART_VolumeUp", this );
        if ( VolumeUpButton != null ) {
            VolumeUpButton.Click += VolumeUp_Click;
        }

        RepeatButton VolumeDnButton = (RepeatButton) Template.FindName( "PART_VolumeDown", this );
        if ( VolumeDnButton != null ) {
            VolumeDnButton.Click += VolumeDown_Click;
        }
    }
}

正如我所说,“输出”窗口不显示任何错误消息,这是WPF在绑定失败时所执行的操作。然而,TextBlock显示的绑定到对话框的Volume属性的值不会改变。问题是TextBlock绑定,Volume控件的绑定还是VolumeControl本身?

1 个答案:

答案 0 :(得分:1)

您似乎在这里有两个Volume属性。第一个是VolumeControl,您可以在其中显示代码。另一个在SettingsDialog上,您只显示XAML。

您的TextBlockVolumeControl都绑定到Volume上的SettingsDialog,但看起来不会更新该属性。您可能打算在VolumeControl上使用TwoWay绑定,如下所示:

<cs:VolumeControl ...
    Volume="{Binding Mode=TwoWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" ... />