Wann ist x:Verweis in WPF gelöst und warum XAML-element, um es beeinflussen?
x: - Referenz kann nicht aufgelöst werden, nachdem ich re-arrangiere die Elemente in XAML.
Hier präsentiere ich einen funktionierenden code. Bewegen Sie einfach die DataGrid-element, also es kommt nach dem button-element und die Bindungen für den Eintrag im ContextMenu-und MultiBinding-in-Taste.IsEnabled werden gebrochen. In-Taste.IsEnabled nur MultiBinding ist gebrochen. Er kann ersetzt werden durch kommentierte block und x:Nachschlagewerke, so dass einzelne Bindung.
Beide werfen XamlParseException.
- MenuItem gibt System.Xaml.XamlObjectWriterException und die Nachricht spricht über ungelöste Referenz.
- MultiBinding gibt System.Sammlungen.Generisches.KeyNotFoundException als innere Ausnahme.
Also, wenn Sie, dass x:Referenz tatsächlich gelöst worden ist und warum nur einige Bindungen zu brechen, wenn referenzierte element hinter dem element, das darauf verweist?
Hier ist mein XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xxx="clr-namespace:WpfApplication1"
Title="MainWindow" SizeToContent="WidthAndHeight">
<Window.Resources>
<xxx:BoolToVisibleConverter x:Key="boolToVisibleConv"></xxx:BoolToVisibleConverter>
<xxx:NullToFalseConverter x:Key="nullToFalseConv"></xxx:NullToFalseConverter>
<xxx:NullsOrToFalseConverter x:Key="nullsOrToFalseConv"></xxx:NullsOrToFalseConverter>
<ContextMenu x:Key="MyMenu">
<MenuItem
Header="Menuitem enabled when row selected"
IsEnabled="{Binding
Path=SelectedItem,
Source={x:Reference dataGridElement},
Converter={StaticResource nullToFalseConv}}" />
</ContextMenu>
</Window.Resources>
<StackPanel>
<DataGrid
Name="dataGridElement"
IsReadOnly="True" />
<Button
Content="Button"
ContextMenu="{StaticResource MyMenu}"
Visibility="{Binding
Path=IsReadOnly,
Source={x:Reference dataGridElement},
Converter={StaticResource boolToVisibleConv}}">
<Button.IsEnabled>
<!--<Binding
Path="SelectedItem"
Source="{x:Reference dataGridElement}"
Converter="{StaticResource nullToFalseConv}"/>-->
<MultiBinding
Converter="{StaticResource nullsOrToFalseConv}">
<Binding
Path="SelectedItem"
Source="{x:Reference dataGridElement}"/>
<Binding
Path="SelectedItem"
Source="{x:Reference dataGridElement}"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
</StackPanel>
</Window>
Hier ist mein Code, der hinter (ohne aufzuhalten der Benutzung):
namespace WpfApplication1
{
///<summary>
///Interaction logic for MainWindow.xaml
///</summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class BoolToVisibleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || (bool)value == false)
return System.Windows.Visibility.Hidden;
else
return System.Windows.Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class NullsOrToFalseConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
foreach (object val in value)
{
if (val == null)
return false;
}
return true;
}
public object[] ConvertBack(object value, Type[] targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class NullToFalseConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (value != null);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, es ist, weil Sie Ihre Ressourcen(Window.Ressourcen) wird zuerst erstellt werden, bevor die referenzierte Instanz vorhanden ist. Ich würde versuchen, dieses Problem zu lösen durch DataContext (ViewModel).
Auszug aus der MSDN(http://msdn.microsoft.com/en-us/library/ee795380.aspx).
x:Referenz ist ein Konstrukt, das in XAML definiert 2009. In WPF können Sie XAML 2009-Funktionen, aber nur für XAML-Code, der nicht WPF markup kompiliert wird. Markup-kompilierte XAML-und die BAML-form von XAML derzeit nicht unterstützt XAML 2009 Sprache Schlüsselwörter und Funktionen.
x:Reference
muss vermieden werden, in WPF. Da diese markup-Erweiterung ist eine neue Ergänzung der XAML-Sprache (2009). Und ist es nicht vollständig unterstützt wird in WPF. VerwendenElementName
in IhremBinding
stattx:Reference
.Auf MSDN.