0

には と の 2 つのユーザー コントロールMainWindow.xamlSidePannelありDescriptionます。私はDictionaryModelオブジェクトを渡しています。DictionaryModelオブジェクトには、 のコレクションとWordsと呼ばれる別のオブジェクトがありますSidePannelModel。には、文字列プロパティSidePannelModelの別のコレクションがあります。Words

DictionaryModel

public class DictionaryModel : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    public SidePannelModel SideModel { get; set; }
    public IEnumerable<WordModel> Language2 { get; set; }

    public void ToggleLanguage()
    {
        var temp = this.Language2;
        this.Language2 = this.SideModel.Language1;
        this.SideModel.Language1 = temp;

        OnPropertyChanged("DictionaryChanged");
    }


    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

SidePannelModel

public class SidePannelModel
{
    public IEnumerable<WordModel> Language1 { get; set; }
    public string SearchWord { get; set; }
}

で DictionaryModel を DataContext に渡していMainWindow.xaml.csます。

    public partial class MainWindow : Window
    {
        private DictionaryModel dictionary;

        public MainWindow()
        {
            InitializeComponent();
            dictionary = new DictionaryModel
            {
                    SideModel = new SidePannelModel {
                    SearchWord=null,
                    Language1 = new List<WordModel>() 
                    { 
                        new WordModel() { Word = "Test1" }
                        , new WordModel() { Word = "Test2" }
                        , new WordModel() { Word = "Test3" }
                        , new WordModel() { Word = "Test4" }
                        , new WordModel() { Word = "Test5" }
                        , new WordModel() { Word = "Test6" }
                        , new WordModel() { Word = "Test7" }
                        , new WordModel() { Word = "Test8" }
                        , new WordModel() { Word = "Test9" }
                        , new WordModel() { Word = "Test10" }

                    } as IEnumerable<WordModel>
                },


                Language2 = new List<WordModel>() 
                { 
                    new WordModel() { Word = "Test1" }
                    , new WordModel() { Word = "Test2" }
                    , new WordModel() { Word = "Test3" }
                    , new WordModel() { Word = "Test4" }
                    , new WordModel() { Word = "Test5" }
                    , new WordModel() { Word = "kkkkk" }
                    , new WordModel() { Word = "Test7" }
                    , new WordModel() { Word = "Test8" }
                    , new WordModel() { Word = "Test9" }
                    , new WordModel() { Word = "Test10" }

                } as IEnumerable<WordModel>,

            };

            this.DataContext = dictionary;
        }
     }

これは、 Collection と をユーザーコントローラーに渡すWords方法SidePannelModelですManiWindow.xaml

<Window x:Class="ThaiDictionary.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sidePanel="clr-namespace:ThaiDictionary"
    Title="MainWindow"
    Height="619">
<Window.Resources>
    <Style TargetType="{x:Type ToggleButton}"
       x:Key="toggleButtonStyle">
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content" Value="Thai to English" />
            </Trigger>
            <Trigger Property="IsChecked" Value="False">
                <Setter Property="Content" Value="English to Thai" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Grid Margin="0,0,2,0">

    <DockPanel LastChildFill="True">
        <Menu IsMainMenu="True" DockPanel.Dock="Top">
            <MenuItem Header="_File" />
            <MenuItem Header="_Edit" />
            <MenuItem Header="_View" />
            <MenuItem Header="_Window" />
            <MenuItem Header="_Help" />
        </Menu>
        <StatusBar Height="22" DockPanel.Dock="Bottom"/>
        <sidePanel:SidePanel SideModel="{Binding SidePModel, Mode=TwoWay}" DockPanel.Dock="Left" MinWidth="200" MinHeight="540" Margin="5,5,5,1" Width="196"/>
        <DockPanel LastChildFill="True" DockPanel.Dock="Left">
            <ToggleButton IsChecked="False" DockPanel.Dock="Top"  HorizontalAlignment="Left" Height="30" Width="150" Style="{StaticResource toggleButtonStyle}" Checked="ToggleButton_Checked" Unchecked="ToggleButton_Unchecked">
            </ToggleButton>
            <sidePanel:Description DockPanel.Dock="Top" WordsList2="{Binding Language2, Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </DockPanel>

    </DockPanel>

</Grid>

SideModelで定義されていSidePannel.xaml.csます。

    public partial class SidePanel : UserControl
{
    public static DependencyProperty SideModelProperty;


    static SidePanel()
    {
        SideModelProperty = DependencyProperty.Register("SideModel", typeof(SidePannelModel), typeof(SidePanel)); 
    }

    public SidePanel()
    {
        InitializeComponent();

    }


    public SidePannelModel SideModel 
    {
         get
        {
            return (SidePannelModel)GetValue(SideModelProperty);
        }
        set
        {
            SetValue(SideModelProperty, value);
        }
    }

}

しかし、コントローラーには、私が期待しSidePanelている s がロードされていません。Word

の適切な部分をSidePanel.xaml以下に示します。

<UserControl x:Class="ThaiDictionary.SidePanel"
         x:Name="SidePannelController"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:l="clr-namespace:ThaiDictionary"
         mc:Ignorable="d" MinHeight="300" MinWidth="300" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Azure">
<UserControl.Resources>

</UserControl.Resources>

<DockPanel LastChildFill="True" DataContext="{Binding SidePModel}">
    <l:SearchTextBox SearchEventTimeDelay="00:00:02.00"  Text="{Binding  ElementName= SidePannelController,  Path= SearchWord, Mode=TwoWay}" DockPanel.Dock="Top"  Search="SearchTextBox_Search" HorizontalAlignment="Stretch" Background="Bisque"/>
    <ListBox Name="LeftSidePnel1" ItemsSource="{Binding  ElementName= SidePannelController,  Path= Language1, Mode=TwoWay}" HorizontalAlignment="Stretch"
         VerticalAlignment="Stretch" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemTemplate="{DynamicResource WordTemplate}" MinHeight="266" Height="auto" >
        <ListBox.Resources>
            <DataTemplate x:Key="WordTemplate">
                <Label Content="{Binding Word}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="auto"/>
            </DataTemplate>
        </ListBox.Resources>
    </ListBox>
</DockPanel>

しかし、プロジェクトを実行すると、サイドパネル ユーザー コントロールに読み込まれた単語が表示されません。このコードの何が問題なのですか。ここから抜け出す方法が見つかりません。すぐに助けてもらえますか。

編集:

命名規則に従い、SidePannel.xaml.cs.

バインディング エラー:

 System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=SidePanelController'. BindingExpression:Path=SearchWord; DataItem=null; target element is 'SearchTextBox' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=SidePanelController'. BindingExpression:Path=Language1; DataItem=null; target element is 'ListBox' (Name='LeftSidePnel1'); target property is 'ItemsSource' (type 'IEnumerable')

完全な SidePanel.xaml を追加し、ElementName を xaml ファイルのように SidePannelController に変更しました。しかし、まだ単語を読み込んでいません

新しい編集:

    System.Windows.Data Information: 41 : BindingExpression path error: 'SearchWord' property not found for 'object' because data item is null.  This could happen because the data provider has not produced any data yet. BindingExpression:Path=SideModel.SearchWord; DataItem='SidePanel' (Name='SidePannelController'); target element is 'SearchTextBox' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 20 : BindingExpression cannot retrieve value due to missing information. BindingExpression:Path=SideModel.SearchWord; DataItem='SidePanel' (Name='SidePannelController'); target element is 'SearchTextBox' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 21 : BindingExpression cannot retrieve value from null data item. This could happen when binding is detached or when binding to a Nullable type that has no value. BindingExpression:Path=SideModel.SearchWord; DataItem='SidePanel' (Name='SidePannelController'); target element is 'SearchTextBox' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=SideModel.SearchWord; DataItem='SidePanel' (Name='SidePannelController'); target element is 'SearchTextBox' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 41 : BindingExpression path error: 'Language1' property not found for 'object' because data item is null.  This could happen because the data provider has not produced any data yet. BindingExpression:Path=SideModel.Language1; DataItem='SidePanel' (Name='SidePannelController'); target element is 'ListBox' (Name='LeftSidePnel1'); target property is 'ItemsSource' (type 'IEnumerable')
System.Windows.Data Information: 20 : BindingExpression cannot retrieve value due to missing information. BindingExpression:Path=SideModel.Language1; DataItem='SidePanel' (Name='SidePannelController'); target element is 'ListBox' (Name='LeftSidePnel1'); target property is 'ItemsSource' (type 'IEnumerable')
System.Windows.Data Information: 21 : BindingExpression cannot retrieve value from null data item. This could happen when binding is detached or when binding to a Nullable type that has no value. BindingExpression:Path=SideModel.Language1; DataItem='SidePanel' (Name='SidePannelController'); target element is 'ListBox' (Name='LeftSidePnel1'); target property is 'ItemsSource' (type 'IEnumerable')

ありがとう

4

2 に答える 2

1

Language1SearchWordはあなたのプロパティではなくUserControl、あなたのプロパティのUserControl.SideModelプロパティです。

したがって、バインディングを変更SideModelしてプロパティに含めると、次のように(または) にPath正しくバインドされます。SidePannelController.SideModel.Language1SearchWord

ItemsSource="{Binding ElementName=SidePannelController, Path=SideModel.Language1}"

ただし、バインディング エラーに"Cannot find source for binding"と表示されているため、実際の XAML が表示されていないと思われます。これは、で指定さSidePannelControllerれた要素が見つからないことを意味しますVisualTree(ElementNameバインディングに使用するソースが指定されているため)。

その場合は、RelativeSourceバインディングを使用して、UserControl代わりにを見つけることができますElementName

ItemsSource="{Binding Path=SideModel.Language1,
    RelativeSource={RelativeSource AncestorType={x:Type l:SidePanel}}"
于 2013-05-07T18:23:07.747 に答える
-1

DictionaryModel が何かわかりません。

},タイプミスかもしれませんが、 MainWindow.xaml.cs の直前にエクストラがある可能性があります。

Language2 = new List<WordModel>()

それはLanguage2のメンバーではなくdictionary.SideModel、コレクションの別の別の要素 (SideModel の兄弟プロパティ?) であることを意味します。

ただし、 MainWindow.xaml では、SideModel へのバインドで Language2 にバインドしています。Language2 は SideModel の子ではないため、XAML はバインドを解決できません。

于 2013-05-07T17:15:54.513 に答える