Привязка данных в комбинированном списке WPF как к пользовательским объектам, так и к datatable.showing System.Data.DataRowView в элементах раскрывающегося списка - PullRequest
0 голосов
/ 29 июня 2010

Я опубликовал похожую проблему здесь и не смог успешно реализовать предложенное мне решение, так как оно не работало. Я нашел способ и хотел улучшить его, привязка комбинированного списка к пользовательским объектам для включения проверки данных. Здесь есть xaml

<Window xmlns:data="clr-namespace:Myproject">

<Window.Resources>
  <data:UserLogin x:Key="user"></data:UserLogin>
  <DataTemplate x:Key="comboTemplate">
        <TextBlock Text="{Binding Path=username}" />
  </DataTemplate>
</Window.Resources>
<ComboBox Margin="18,121,24,0" Name="cmbEmail" Tag="email" TabIndex="1" ToolTip="enter the email you signed up with here" IsEditable="True" IsSynchronizedWithCurrentItem="True" ItemTemplate="{StaticResource comboTemplate}"  ItemsSource="{Binding}" Height="23" VerticalAlignment="Top" Style="{DynamicResource cmbBoxerrors}">
            <ComboBox.Text>
                <Binding Path="Loginname" Source="{StaticResource user}" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <ExceptionValidationRule/>
                    </Binding.ValidationRules>
                </Binding>
            </ComboBox.Text>       
 </ComboBox>
</Window>

, а xaml.cs -

           if (con != null)
            {
                if (con.State == ConnectionState.Closed)
                    con.Open();

                SqlCeCommand cmdusers = new SqlCeCommand("select * from users order by id", con);

                SqlCeDataAdapter da = new SqlCeDataAdapter(cmdusers);
                userdt = new DataTable("users");
                da.Fill(userdt);

                cmbEmail.DataContext = userdt;

             }  

и класс UserLogin равен

 class UserLogin :IDataErrorInfo
{
    private string _loginname = "";
    private string _password;


    public string this[string columnName]
    {
        get 
        {  


            string result = null;
            if(columnName == "Loginname")
            {
                if(string.IsNullOrEmpty(this._loginname))
                {
                    result = "Login Name cannot be Empty";
                }
            }

            if (columnName == "Loginname")
            {
                if(!Util.ValidateRegexPatern(Properties.Resources.emailRegex,this._loginname))
                {
                    result = "MalFormed Email address. Please write a correct email addess";
                }
            }

            return result;
        }
    }

    public string Error
    {
        get { return null; }
    }

    public string Password
    {
        get { return _password; }
        set { _password = value; }
    }

    public string Loginname
    {
        get { return _loginname; }
        set { _loginname = value; }
    }
}

проблема в том, что когда я использую ItemTemplate, выбранный элемент показывает System.Data.DataRowView, но элементы раскрывающегося списка отображаются правильно, и когда я заменяю ItemTemplate на DisplayMemberPath, происходит обратное поведение, так как в выбранных элементах правильно и раскрывающийся список элементы показывают System.Data.DataRowView. Использование их обоих вызывает исключение, так как я не могу использовать их оба, выбранные элементы раскрывающегося списка отображаются правильно.

Я действительно не знаю, что я делаю неправильно. Может кто-нибудь пролить свет на это, я буду очень благодарен. Спасибо за чтение этого

1 Ответ

1 голос
/ 29 июня 2010

Это выглядит так: вы устанавливаете контекст данных ComboBox для экземпляра типа DataTable.Затем вы устанавливаете ItemsSource в {Binding}, что означает, что каждый элемент в ComboBox будет привязываться к DataRow (у которого нет ни имени входа, ни имени пользователя в качестве свойств).И тут переплет перестает работать.Не существует неявного способа преобразования DataRow в UserLogin.

Вы можете либо реализовать преобразователь для выполнения преобразования, либо преобразовать строки в UserLogin по одной и установить DataContext ComboBox в список UserLogin.(или ObservableCollection, если вам нужна более продвинутая функциональность).

В любом случае отбросьте деталь <ComboBox.Text> ... </ComboBox.Text>.

Надеюсь, это поможет вам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...