IMul​​tiValueConverter从MainWindow通过UserControl绑定到UIElement

时间:2016-02-18 13:34:44

标签: c# wpf xaml user-controls imultivalueconverter

项目类型: .NET 4.0 WPF桌面应用程序

问候。

我目前正致力于在WPF应用程序中使用IMultiValueConverters将两个ComboBox的SelectedItem属性绑定到按钮的IsEnabled属性的解决方案。 ComboBox放在单独的UserControls中,它们与Button本身一起嵌套在MainWindow中。

Visualized Layout

MainWindow.xaml

<Window>
    <Window.Resources>
        <local:MultiNullToBoolConverter x:Key="MultiNullToBoolConverter" />
    </Window.Resources>
    <Grid>
        <local:ucDatabaseSelection x:Name="ucSourceDatabase" />
        <local:ucDatabaseSelection x:Name="ucTargetDatabase" />
        <Button x:Name="btnContinue">
            <Button.IsEnabled>
                <MultiBinding Converter="{StaticResource MultiNullToBoolConverter}">
                    <Binding ElementName="ucSourceDatabase" Path="cbxServerDatabaseCollection.SelectedItem" />
                    <Binding ElementName="ucTargetDatabase" Path="cbxServerDatabaseCollection.SelectedItem" />
                </MultiBinding>
            </Button.IsEnabled>
        </Button>
    </Grid>
</Window>

ucDatabaseSelection.xaml

<UserControl>
    <ComboBox x:Name="cbxServerDatabaseCollection">
        <ComboBoxItem Content="Server A" />
        <ComboBoxItem Content="Server B" />
    </ComboBox>
</UserControl>

MultiNullToBoolConverter.cs

/// <summary>
/// Converts two objects (values[0] and values[1]) to boolean
/// </summary>
/// <returns>TRUE if both objects are not null; FALSE if at least one object is null</returns>
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    if (values[0] != null && values[1] != null) return true;
    else return false;
}

只有两个ComboBox的IsEnabled属性不为空时,Button的SelectedItem属性才应为true。

我现在遇到的问题是我无法通过UserControls和ComboBox从MainWindow按钮获取Binding。我在这里是否缺少UpdateTriggers,或者如果不在UserControl类中使用DependencyProperties直接绑定它?

1 个答案:

答案 0 :(得分:1)

WPF数据绑定仅适用于公共属性。因此,UserControl需要具有返回cbxServerDatabaseCollection字段值的公共属性,例如:

public ComboBox CbxServerDatabaseCollection
{
    get { return cbxServerDatabaseCollection; }
}