IMultiValueConverter 从 MainWindow 通过 UserControl 绑定到 UIElement
IMultiValueConverter Binding from MainWindow through UserControl onto UIElement
项目类型: .NET 4.0 WPF 桌面应用程序
你好。
我目前正在研究一种解决方案,在 WPF 应用程序中利用 IMultiValueConverters 将两个组合框的 SelectedItem
属性绑定到按钮的 IsEnabled
属性。 ComboBoxes 放置在单独的 UserControls 中,这些 UserControls 与 Button 本身一起嵌套在 MainWindow 中。
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;
}
只有当两个组合框的 SelectedItem
属性都不为空时,按钮的 IsEnabled
属性 才应为真。
我现在遇到的问题是我无法使绑定从 MainWindow 按钮通过 UserControl 运行到 ComboBox。我是不是在这里遗漏了 UpdateTriggers,或者如果不在 UserControl 中使用 DependencyProperties 就无法直接绑定它 class?
WPF 数据绑定仅适用于 public 属性。因此,UserControl 需要有一个 public 属性 即 returns cbxServerDatabaseCollection
字段值,例如:
public ComboBox CbxServerDatabaseCollection
{
get { return cbxServerDatabaseCollection; }
}
项目类型: .NET 4.0 WPF 桌面应用程序
你好。
我目前正在研究一种解决方案,在 WPF 应用程序中利用 IMultiValueConverters 将两个组合框的 SelectedItem
属性绑定到按钮的 IsEnabled
属性。 ComboBoxes 放置在单独的 UserControls 中,这些 UserControls 与 Button 本身一起嵌套在 MainWindow 中。
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;
}
只有当两个组合框的 SelectedItem
属性都不为空时,按钮的 IsEnabled
属性 才应为真。
我现在遇到的问题是我无法使绑定从 MainWindow 按钮通过 UserControl 运行到 ComboBox。我是不是在这里遗漏了 UpdateTriggers,或者如果不在 UserControl 中使用 DependencyProperties 就无法直接绑定它 class?
WPF 数据绑定仅适用于 public 属性。因此,UserControl 需要有一个 public 属性 即 returns cbxServerDatabaseCollection
字段值,例如:
public ComboBox CbxServerDatabaseCollection
{
get { return cbxServerDatabaseCollection; }
}